SQL Server 如何更新具有NULL值的列

knsnq2tg  于 2023-01-12  发布在  其他
关注(0)|答案(2)|浏览(113)

我有两张table
结核菌素1

ID  Name  Birthdate
--------------------
1   Ball  NULL
2   Tire  2022-01-01
3   Ball  1900-01-01

结核菌素2

ID     Name  Birthdate
------------------------
NULL   Ball  NULL
NULL   Tire  2022-01-01
NULL   Ball  1900-01-01

我想更新Tb2.ID以遵循Tb1.ID,因此下面是我的脚本

UPDATE Tb2.ID = Tb1.ID
FROM Tb2
LEFT JOIN Tb1 ON Tb2.Name = Tb1.Name
              AND ISNULL (Tb2.Birthdate, '') = ISNULL (Tb1.Birthdate, '')
WHERE Tb2.ID IS NULL

结果是ID 1在Tb 2中有2行,如下表所示
| 识别号|姓名|出生日期|
| - ------|- ------|- ------|
| 1个|球|零|
| 第二章|轮胎|2022年1月1日|
| 1个|球|一九○ ○年一月一日|
我期望将此记录的ID 3更新为Tb 2

ID   Name   Birthdate
----------------------
3    Ball   1900-01-01

你们能帮忙吗?
我怀疑脚本中Birthdate的连接条件出错。
先谢了

5vf7fwbs

5vf7fwbs1#

试试看:

UPDATE Tb2
SET Tb2.ID = Tb1.ID
FROM Tb2
LEFT JOIN Tb1
ON Tb2.Name = Tb1.Name
AND ISNULL(Tb2.Birthdate,'9999-12-31') = ISNULL(Tb1.Birthdate,'9999-12-31')
WHERE Tb2.ID IS NULL

我认为空字符串在ISNULL中转换为1900-01-01,使用无效(但不是1900-01-01)日期作为NULL出生日期可以解决这个问题。

kcugc4gi

kcugc4gi2#

如果您使用的是SQL Server 2022(或更高版本),则还可以使用新的IS [NOT] DISTINCT FROM语法。这允许比较空值和非空值。

UPDATE Tb2
SET ID = Tb1.ID
FROM Tb2
JOIN Tb1
    ON Tb2.Name = Tb1.Name
    AND Tb2.Birthdate IS NOT DISTINCT FROM Tb1.Birthdate
WHERE Tb2.ID IS NULL

注意,不需要使用左连接,因为您实际上只想在有匹配时更新,请使用内连接。
另请参见this db<>fiddle,了解DISTINCT FROM的快速演示。

相关问题