SQL比较和空值的问题

Hea*_*her 19 sql sql-server-2008

我有一个更新查询,当值与另一个表中的字段不匹配时更新一个表中的字段.

UPDATE  table1
SET     a.field1 = b.field3
FROM    table1 a ,
        table2 b
WHERE   a.field2 = b.field2
        AND a.field1 <> b.field3
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,当a.field1为null并且b.field3为值时,如果a.field1为值且b.field3为null,则不会拾取.

我通过添加以下内容来解决这个问题...

UPDATE  table1
SET     a.field1 = b.field3
FROM    table1 a ,
        table2 b
WHERE   a.field2 = b.field2
        AND ( a.field1 <> b.field3
              OR (a.field1 IS NOT NULL
              AND b.field3 IS NULL)
              OR (a.field1 IS NULL
              AND b.field3 IS NOT NULL)
            )
Run Code Online (Sandbox Code Playgroud)

我的问题更集中在为什么会发生这种情况以及如何最好地构建查询以防止这种情况?

Nor*_*108 10

问题是NULL比较.如果a.field1或b.field3为NULL,则需要使用IS NULL或IS NOT NULL语句.您可以将a.field1和b.field3的默认值与ISNULL函数一起使用.

ISNULL(a.field1,0) <> ISNULL(b.field3,0)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,与值0进行比较.

  • @ Norberto108:如果"它[似乎]工作"那么它并不意味着"[好]解决方案".如果`a.field1 = 0 AND b.field3 IS NULL`怎么办? (2认同)
  • @BogdanSahlean 0必须是一个任意的,超出范围值.关键是要继续使用<>运算符.它可能是-1等等...... (2认同)

Ale*_*nko 7

将任何内容与NULL进行比较的结果,甚至本身,总是为NULL(不是TRUE或FALSE).使用EXISTS和EXCEPT运算符选项.

UPDATE table1
SET a.field1 = b.field3
FROM table1 a JOIN table2 b ON a.field2 = b.field2
WHERE EXISTS (
              SELECT a.field1
              EXCEPT
              SELECT b.field3
              )
Run Code Online (Sandbox Code Playgroud)

  • 绝对是最好的答案,如 [此处] 所记录(http://sqlblog.com/blogs/paul_white/archive/2011/06/21/undocumented-query-plans-equality-comparisons.aspx)。`ISNULL()` 选项效果很好,直到它没有。 (2认同)

DOK*_*DOK 2

除了正确处理 NULL 逻辑之外,您还需要将要一起应用的多个条件括在括号中

像这样的东西(不确定我是否完全理解你的条件)。

UPDATE  table1
SET     a.field1 = b.field3
FROM    table1 a ,
        table2 b
WHERE   a.field2 = b.field2
        AND (
              ( a.field1 <> b.field3)
              OR (a.field1 IS NOT NULL AND b.field3 IS NULL)
              OR (a.field1 IS NULL AND b.field3 IS NOT NULL)
            )
Run Code Online (Sandbox Code Playgroud)