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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL更新语句 - 比较可空字段的值相关的知识,希望对你有一定的参考价值。

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

但是,由于有时我们可以拥有需要比较的可空字段,这会导致一些问题。

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

  • dest.col1 <> src.col1 - 这是不可能的因为Nullables不会相互匹配
  • isnull(dest.col1,0)<> isnull(src.col1,0) - 也不是选项,因为字段可以包含空值和零。如果出现问题并且需要重新加载,则值可以为null和number
  • ((dest.col1 <> src.col1)OR(dest.col1为null,src.col1不为null)OR(dest.col1不为null且src.col1为null)) - 也不是选项,因为我们有数百万条记录,这将需要更多行,然后需要更新。

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

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

答案

在代码示例中尝试此案例:

    ;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'

以上是关于SQL更新语句 - 比较可空字段的值的主要内容,如果未能解决你的问题,请参考以下文章

sql语句查询表中一个字段的值小于另一个字段的值怎么写?

sql语句更新字段里面的值,比方说 我要去掉某一列里面所有值的最后的一个字母(有空值)

sql 更新一个字段,条件是.....

更新一个表的字段值等于另一个表的字段值的SQL语句

MYSQL怎么将表中的A字段值更新B字段值?求sql语句

如何使用 like 语句运行 SQL 更新查询