【问题标题】:Find rows with same non-null values查找具有相同非空值的行
【发布时间】:2022-02-06 09:08:05
【问题描述】:

这似乎是一个相当简单的问题,但我一直无法找到解决方案:

在表 test 中,我有一些我感兴趣的列子集,例如 a,b,c,d,e,f

这些列中的一些或大部分是NULL,但至少有一个总是被填充。

现在返回一些行,例如:

SELECT rowid,a,b,c,d,e,f LIMIT 1;

我想获取具有相同非空值的行数。
例如,如果a,d,f 是该行不是NULL 的列,则结果将与以下相同:

SELECT COUNT(*) 
FROM test WHERE a=a_ AND d=d_ AND f=f_ 

SELECT a as a_, d as d_, f as f_ FROM test LIMIT 1;

如何一步/一行完成?还是我需要一个临时表?

【问题讨论】:

    标签: sqlite join null subset sql-null


    【解决方案1】:

    您可以使用运算符IS 安全地比较可能是NULL 的值:

    SELECT COUNT(*) 
    FROM test t1
    INNER JOIN (SELECT a, b, c, d, e, f FROM test LIMIT 1) t2
    ON (t1.a, t1.b, t1.c, t1.d, t1.e, t1.f) IS (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f);
    

    或使用 CTE:

    WITH cte AS (SELECT a, b, c, d, e, f FROM test LIMIT 1)
    SELECT COUNT(*) 
    FROM test t1 INNER JOIN cte t2
    ON (t1.a, t1.b, t1.c, t1.d, t1.e, t1.f) IS (t2.a, t2.b, t2.c, t2.d, t2.e, t2.f);
    

    请参阅demo

    【讨论】:

    • 谢谢!不需要别名意味着我也可以在两边都使用例如a
    • @RadioControlled 是的,如果它们都使用表的别名正确限定,则可以,例如 t2.a
    • 如果您愿意,欢迎您在没有别名的情况下简化您的代码。
    • @RadioControlled 完成了,看起来更好了。
    • 啊,不幸的是我刚刚意识到有一个误解:我正在寻找 t1 中的值为 NULL 或等于 t2 中的相应值的所有行...
    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 2016-01-27
    • 2012-06-18
    相关资源
    最近更新 更多