【问题标题】:SQL Case on left join with Nulls [closed]使用 Null 进行左连接的 SQL 案例 [关闭]
【发布时间】:2020-10-20 10:21:39
【问题描述】:

我正在尝试通过将新数据左连接到原始数据并比较输出来创建比较查询。我的查询很简单,但似乎无法让它做我想做的事。我知道我无法像其他值一样比较 NULL 值,但我希望通过执行 ISNULL 可以得到我需要的结果:

SELECT  O.Ded1,         
        ISNULL(N.Ded2, 0) AS Ded2,      
        CASE
          WHEN O.Ded1 =  N.Ded2 THEN 'Correct' 
          ELSE 'Incorrect'
        END AS 'DED CHECK'

FROM #Tmp_ORIG_DATA O

LEFT JOIN #Tmp_NEW_DATA N ON O.ID = N.ID

我想知道是否需要将这些值插入到临时表中以使其成为物理值?

提前致谢

抱歉,我应该添加此查询的结果:

我真的希望支票显示正确。

谢谢

【问题讨论】:

  • #Tmp_ORIG_DATA 是如何定义的?
  • NULL 不等于包括NULL 在内的任何其他值。 NULL = NULL 返回 UNKNOWN,这是(重要的)not TRUE。如果您需要在两个值都是NULL 的情况下进行比较,则使用`IS NULL` 和ANDCOL1 IS NULL AND COL2 IS NULL
  • 谢谢大家,我刚刚添加了我目前得到的结果的图像。
  • Larnu - 原始数据中没有 Null 值。所以它将 0 与 Null 进行比较,但我认为通过添加 ISNULL(....,0) 可以解决这个问题?
  • 预期结果很好,但我们也需要样本表数据——我们大多数人都希望它是格式化文本,而不是图像。 minimal reproducible example

标签: sql sql-server left-join case sql-null


【解决方案1】:

您明确检查无效性。需要额外检查以区分不匹配的行和Ded2null 的匹配行。

SELECT  
    O.Ded1,         
    N.Ded2,      
    CASE
        WHEN O.Ded1 =  N.Ded2
            OR (N.ID IS NOT NULL AND o.Ded1 IS NULL AND N.Ded2 IS NULL) 
        THEN 'Correct' 
        ELSE 'Incorrect'
    END AS 'DED CHECK'
FROM #Tmp_ORIG_DATA O
LEFT JOIN #Tmp_NEW_DATA N ON O.ID = N.ID

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 2013-05-17
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多