【问题标题】:SQL update statement - comparing values for nullable fieldsSQL 更新语句 - 比较可为空字段的值
【发布时间】:2019-02-06 12:17:17
【问题描述】:

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

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

我们尝试了以下 3 个选项:

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

我们可以对带有 match 和 intersect 的 Merge 语句使用类似的方法,但我们注意到这对于数百万条记录并不是最优的。

还有其他可行的选择吗?

【问题讨论】:

  • 第三个选项如何更新不必要的行数?示例数据和预期输出将在这里有所帮助。
  • @RyanBalzan 。 . .第三个选项是正是您声称想要的逻辑。它不应更新不必要的行数。

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


【解决方案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'

【讨论】:

  • 我试图弄清楚你将如何在 where 子句中使用它作为更新的谓词。你能详细说明一下吗?
  • 你可以写一个cte例子,把结果加到where子句中,我会编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多