【问题标题】:Should I add COALESCE to all my <> comparisons?我应该将 COALESCE 添加到我的所有 <> 比较中吗?
【发布时间】:2019-09-23 09:22:41
【问题描述】:

在运行我的脚本一段时间后,我意识到&lt;&gt; 运算符没有按应有的方式工作,或者至少在涉及NULL 值时没有工作。我的许多MERGE 命令没有落在UPDATE 块中,因为&lt;&gt; 没有检测到两个不同的值。

因此,为了进行一些比较,我添加了COALESCE

例如而不是

Value1 <> Value2

我用过

COALESCE(Value1, '') <> COALESCE(Value2, '')

问题是将COALESCE 添加到所有其他的是否安全,或者这是否也取决于数据类型或是否有其他警告?

【问题讨论】:

  • 在这种情况下,我会使用 ISNULL 而不是 COALESCE,因为只有值(字段和默认值)。但请记住,您将 NULL 默认为 '',这意味着 Value1 = NULL 和 Value2 = '' 它们被认为是相等的
  • 是的,你是对的。在这种情况下,IS NULL 是一个更好的选择,但我也会确保这些值可以为空。
  • CoalesceIsNull 之间的差异是 hereCoalesce 是标准 SQL,可以处理两个以上的参数。正如 Luc 所指出的,您正在引入一个 magic value 而不是进行精确比较,即Value1 != Value2 or ( Value1 is NULL and Value2 is not NULL ) or ( Value1 is not NULL and Value2 is NULL )

标签: tsql coalesce null-coalescing-operator


【解决方案1】:

只要您的系统认为 NULL 和零长度字符串是等价的,您就可以像这样进行合并,即:NULL = ''

如果您的合并语句中有大量比较列表,您可以尝试将其替换为 EXCEPT 集合运算符

WHEN MATCHED AND EXISTS (SELECT SRC.* EXCEPT SELECT TGT.*) THEN
   UPDATE ...

NULL 值与 NULL 相比是未知的,但在基于集合的操作中,它们会寻找区别:NULL 与非空值不同,但 NULL 与另一个 NULL 没有区别。

如果 SRC 行和 TGT 行相同,它将返回一个空集,从而跳过更新。

【讨论】:

    【解决方案2】:

    COALESCE 命令应该在数据可以是NULL 时使用,例如您没有使用内连接或列允许空值。个人意见:如果可以避免,不要强迫系统做出不必要的指令。

    对于 SQL NULLNULL 是未知值,它们不能相等也不能不同。见例子:

    declare @vA int
    declare @vB int
    
    select @vA, @vB, iif(@vA = @vB, 1, 0), iif(@vA <> @vB, 1, 0)
    

    【讨论】:

    • 如果列可以为空,最好使用它们,对吗?
    • 或者你正在做一个左外连接、右外连接或全外连接。
    猜你喜欢
    • 2023-03-12
    • 2018-11-24
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多