Sql 比较多个可以为空的列

Sql 比较多个可以为空的列,sql,logic,teradata,Sql,Logic,Teradata,我想比较一组列并决定: 如果所有不为NULL的列都相等 如果任何不为NULL的列不相等 如果所有列都为空 输入和输出示例: Inn: 'NO', NULL, 'GB', 'NO', 'NO' Out: 1) FALSE; 2) TRUE; 3) FALSE ---- Inn: 'NO', NULL, 'NO', 'NO', 'NO' Out: 1) TRUE; 2) FALSE; 3) FALSE ---- Inn: NULL, NULL, NULL, NULL, NULL Out: 1) FA

我想比较一组列并决定:

  • 如果所有不为NULL的列都相等
  • 如果任何不为NULL的列不相等
  • 如果所有列都为空
  • 输入和输出示例:

    Inn: 'NO', NULL, 'GB', 'NO', 'NO'
    Out: 1) FALSE; 2) TRUE; 3) FALSE
    ----
    Inn: 'NO', NULL, 'NO', 'NO', 'NO'
    Out: 1) TRUE; 2) FALSE; 3) FALSE
    ----
    Inn: NULL, NULL, NULL, NULL, NULL
    Out: 1) FALSE; 2) FALSE; 3) TRUE
    
    我需要测试的列数相当多,因此比较每个列的逻辑语句有点麻烦


    系统:Teradata SQL数据库

    您将使用一个
    大小写
    表达式。也许:

    select (case when a is null and b is null and c is null and d is null
                 then 'all null'
                 when coalesce(a, b, c, d) = coalesce(b, c, d, a) and
                      coalesce(a, b, c, d) = coalesce(c, d, b, a) and
                      coalesce(a, b, c, d) = coalesce(d, a, b, c)
                 then 'all non-nulls are equal'
                 else 'unequal'
             end);
    

    是否要逐行检查每列结果?也许您可以使用case语句使其工作?因为您(如建议的)有相对较多的列,所以我将尝试将每条记录透视到一个列表中,并对其执行操作。是的,如果您的原始表有数百万条记录,这可能会变得非常昂贵,但是构建
    案例
    结构的替代方案将占用您的睡眠时间。在讨论这个问题之前,我会想很多次。我不理解你们的第二个测试(结合)。如果a、b、c和d中的任何一个为null,则合并它们将导致null。我想这是为了检查任何非null匹配,但是这个测试只有在所有4个都不是null时才有效吗?@Andrew。相反。若a、b、c、d中的任何一个都不为null,则合并将不为null。
    coalesce()
    只有当所有的都为空时才会为空。哦,天啊,不知怎么的,我设法看到并写入了
    coalesce
    ,但我认为
    concat
    。一定是度假的时间了。。。