Nulls和MERGE语句:我需要将值设置为无穷大.怎么样?

Iam*_*mIC 14 sql-server null sql-server-2008

在SQL Server 2008中,我使用的是MERGE.一切都很好,除了我有2个可以为空的列.如果我传递一个空值并且目标不是null,则MERGE没有看到差异(每个BOL对ev = false = false ).如果我在两侧使用IsNull(源和目标),但有可能错误评估值的问题.

我的意思是,如果我说:

WHEN MATCHED AND NOT (IsNull(tgt.C, 0) = IsNull(src.C, 0)) THEN
Run Code Online (Sandbox Code Playgroud)

那么如果tgt.C为null且src.C = 0,则不会执行更新.无论我选择什么替代价值,我都会遇到这个问题.

我还尝试了"AND NOT(... true ...)"语法,因为BOL声明对null的评估结果为FALSE.但是,它们似乎实际上导致NULL并且不会导致我的多部分语句变为false.

我认为一种解决方案是使用NaN或-INF或+ INF,因为它们在目标中无效.但是我找不到在SQL中表达这种方法的方法.

任何想法如何解决这个问题?

编辑:

以下逻辑解决了这个问题,但它很冗长,不会导致快速逃避:

declare @i int, @j int

set @j = 0
set @i = 0

if ISNULL(@i, 0) != ISNULL(@j, 0) OR 
    ((@i is null or @j is null) and not (@i is null and @j is null))
    print 'update';
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 20

您可以使用

WHEN MATCHED AND EXISTS (SELECT tgt.C EXCEPT SELECT src.C)
Run Code Online (Sandbox Code Playgroud)

有关此问题的更多信息,请参阅此文章.

  • 这确实是一个很棒的方法。它实际上在我的代码中看起来不错。读起来类似于“当匹配并且源数据与目标数据的这些字段中存在更改时” (2认同)

Ant*_*y K 14

您可以更改merge语句的ON部分,检查source和target是否为null.

MERGE tgt
USING src
ON ( -- enter non-nullable columns to match on ...
    tgt.A = src.A
    AND (tgt.C = src.C OR (tgt.C IS NULL AND src.C IS NULL))
)
WHEN MATCHED -- ...
Run Code Online (Sandbox Code Playgroud)


Daw*_*awn 6

事实上,这样效果更好。只需添加另一个替换值作为 OR :-

WHEN MATCHED AND 
    ( 
    NOT (IsNull(tgt.C, 0) = IsNull(src.C, 0)) OR NOT (IsNull(tgt.C, 1) = IsNull(src.C, 1)) 
    ) 
THEN ....
Run Code Online (Sandbox Code Playgroud)