SQL更新语句-比较可为空字段的值

时间:2018-08-31 12:51:36

标签: sql sql-server sql-update sql-merge

因此,我们在DWH环境中使用SQL Server,并且比较源和目标之间的值以相应地更新值。在某些Merge语句中,我们将匹配条件与intersect语句一起应用,但是在某些情况下,我们直接使用update并检查OR条件。

但是,由于有时我们可能需要比较可为空的字段,所以这会引起一些问题。

我们尝试了以下3种选择:

  • dest.col1 <> src.col1-这是不可能的,因为Nullable无法彼此匹配
  • isnull(dest.col1,0)<> isull(src.col1,0)-也不是一个选项,因为字段可以同时包含null和零。如果出现问题并需要重新加载,则值可以为null和数字
  • (((dest.col1 <> src.col1)OR(dest.col1为空且src.col1不为空)OR(dest.col1不为空且src.col1为空))-也不是一种选择因为我们有数百万条记录,因此需要更新的行数更多。

我们可以对具有匹配和相交的Merge语句使用类似的方法,但是我们注意到这对于数百万条记录不是最佳的。

还有其他可行的选择可以实现吗?

1 个答案:

答案 0 :(得分:1)

请尝试以下CASE WHEN代码示例:

    ;WITH CTE AS 
(
    SELECT *,
    CASE WHEN ColA IS NULL AND ColB IS NULL THEN 'Equal'
         WHEN ColB IS NOT NULL AND ColB IS NOT NULL 
                                               THEN CASE WHEN ColA = ColB THEN 'Equal'
                                               ELSE 'Not Equal' END
         WHEN ColA IS NULL AND ColB IS NOT NULL THEN 'Not Equal'
         WHEN ColB IS NULL AND ColA IS NOT NULL THEN 'Not Equal'
    END 'Comparison'
FROM YourTable
)                 

DELETE FROM CTE WHERE Comparison = 'Not Equal'