【发布时间】:2022-02-10 09:00:43
【问题描述】:
如果现有记录发生更改,我需要更新表。如果记录存在(找到 APK),则在 ID_NUMBER 已更改时更新它。问题是当现有的 TARGET 值不是 NULL 并且 SOURCE 值是 NULL 时。我怎样才能检测到这种情况不相等?
使用 ISNULL() 可以工作,但第二个参数不能出现在数据中。这需要分析所有 NUMERIC 数据。没有它可以吗?在这种情况下,零 (0) 只有当它从未出现在数据中时才能起作用。
UPDATE T SET
T.f1 = S.f1
FROM TARGET_TABLE T
INNER JOIN SOURCE_TABLE S
ON T.APK = S.APK
WHERE
ISNULL(T.ID_NUMBER,0) <> ISNULL(S.ID_NUMBER,0)
;
这是 TARGET 和 SOURCE 表中 ID_NUMBER 值的可能组合。
Target Source
====== ======
NULL NULL
NULL 7 -- should identify as unequal
7 NULL -- should identify as unequal, BUT DOES NOT
7 7
以下脚本显示了结果。只有第三条语句将现有的 TARGET 值 7 与传入的 SOURCE 值 NULL 进行比较将失败。这是为什么?什么代码可以工作?
SET NOCOUNT ON;
SELECT 3 WHERE ISNULL(NULL, NULL+1) <> ISNULL(NULL,NULL+1);
GO
SELECT 3 WHERE ISNULL(NULL, 7+1) <> ISNULL(7,7+1);
GO
SELECT 3 WHERE ISNULL(7, NULL+1) <> ISNULL(NULL,NULL+1); -- WHY DOES THIS NOT SEE THE INEQUALITY?
GO
SELECT 3 WHERE ISNULL(7, 7+1) <> ISNULL(7,7+1);
GO
示例执行:
1> SET NOCOUNT ON;
2> SELECT 3 WHERE ISNULL(NULL, NULL+1) <> ISNULL(NULL,NULL+1);
3> GO
-----------
1> SELECT 3 WHERE ISNULL(NULL, 7+1) <> ISNULL(7,7+1);
2> GO
-----------
3
1> SELECT 3 WHERE ISNULL(7, NULL+1) <> ISNULL(NULL,NULL+1); -- WHY DOES THIS NOT SEE THE INEQUALITY?
2> GO
-----------
1> SELECT 3 WHERE ISNULL(7, 7+1) <> ISNULL(7,7+1);
2> GO
-----------
1>
【问题讨论】:
-
仅供参考
null + 1是null。
标签: sql sql-server