【问题标题】:SQL: mix join with case and NULLSQL:混合连接与大小写和 NULL
【发布时间】:2014-08-15 20:12:38
【问题描述】:

很简单,由于= 操作数不适用于NULL,因此修复下面的NULL 过滤的最佳方法是什么?

Key2,当Data1=-1,正在尝试做一个Key2=NULL,它没有选择NULL 值。

LEFT JOIN myReferenceTable
    on myReferenceTable.Key1 = myDataTable.FKey1
    and myReferenceTable.Key2 =
    CASE
        WHEN myDataTable.Data1 = -1 THEN NULL
        ELSE myDataTable.Data3 - myDataTable.Data4 
END

谢谢!

【问题讨论】:

  • @GordonLinoff 它是 - (我正在计算 Data3 和 Data4 列的值)

标签: sql join null case


【解决方案1】:

使用 AND / OR 替换您的案例陈述

LEFT JOIN myReferenceTable
    on myReferenceTable.Key1 = myDataTable.FKey1
    and ((myDataTable.Data1 = -1 AND myReferenceTable.Key2 IS NULL) 
           OR (myDataTable.Data1 != -1 AND myReferenceTable.Key2 = myDataTable.Data3 - myDataTable.Data4)) 

【讨论】:

  • 谢谢...应该是更简单的方法:/
【解决方案2】:

如果您使用的是 MySQL,则需要使用“null-safe equal”运算符。

来自manual

NULL 安全相等。该运算符执行相等比较,例如 = 运算符,但如果两个操作数都是,则返回 1 而不是 NULL NULL,如果一个操作数为 NULL,则为 0 而不是 NULL。

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

【讨论】:

    【解决方案3】:

    我的理解是,您正在尝试将 ReferenceTable 加入 Key1 和 Key2 上的 DataTable,(Key1 是直接匹配,而 Key2 匹配 Data3 和 Data4 之间的差异)但您想显式过滤掉 Data1 所在的行= -1。如果 Data1 = -1,您似乎也希望返回 NULL,但返回的内容取决于您的 SELECT 语句中的内容。我们在这里讨论的是联接,而您正在执行左联接,它告诉我您希望返回 myRerenceTable 中的所有行,无论 myDataTable 中是否存在匹配项。话虽如此,我会把 Join 写成:

        LEFT JOIN myReferenceTable
            on myReferenceTable.Key1 = myDataTable.FKey1
            and myDataTable.Data1 <> -1
            AND myReferenceTable.Key2 = myDataTable.Data3 - myDataTable.Data4 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多