SQL Server 2022 新语法:IS [NOT] DISTINCT FROM 彻底解决 NULL 比较难题

张开发
2026/4/28 8:55:54 15 分钟阅读
SQL Server 2022 新语法:IS [NOT] DISTINCT FROM 彻底解决 NULL 比较难题
在日常开发中NULL 值的比较一直是 SQL Server 的痛点之一。NULL NULL返回的不是TRUE而是NULL导致很多场景下需要写繁琐的IS NULL判断。SQL Server 2022 引入了IS [NOT] DISTINCT FROM语法彻底解决了这个问题。老写法的痛点先看一个典型场景比较两列值是否相等其中可能包含 NULL。测试数据CREATE TABLE #TestData ( ID INT, ColA NVARCHAR(50), ColB NVARCHAR(50) ) INSERT INTO #TestData VALUES (1, Apple, Apple), (2, Apple, Banana), (3, NULL, NULL), (4, NULL, Apple), (5, Apple, NULL)如果不处理NULLSELECT * FROM #TestData WHERE ColA ColB结果字段为NULL的没有搜索出来老写法需要手动处理 NULL-- 判断两列相等含 NULL 相等的语义 SELECT * FROM #TestData WHERE (ColA ColB) OR (ColA IS NULL AND ColB IS NULL)逻辑没问题但写法很繁琐。当列增多时代码可读性急剧下降。SQL Server 2022 新写法IS NOT DISTINCT FROM-- 新写法语义完全一致简洁清晰 SELECT * FROM #TestData WHERE ColA IS NOT DISTINCT FROM ColB核心语义A IS NOT DISTINCT FROM BA 和 B 相等NULL NULL 视为相等等价于(A B) OR (A IS NULL AND B IS NULL)A IS DISTINCT FROM BA 和 B 不相等等价于NOT ((A B) OR (A IS NULL AND B IS NULL))反向用法IS DISTINCT FROM-- 找出两列值不同的行含 NULL 不同的语义 SELECT * FROM #TestData WHERE ColA IS DISTINCT FROM ColB在 UPDATE 中的典型应用这个语法在数据同步场景中非常有用。只更新真正有变化的行包括 NULL 变动CREATE TABLE #Source (ID INT, Val NVARCHAR(50)) CREATE TABLE #Target (ID INT, Val NVARCHAR(50)) INSERT INTO #Source VALUES (1, A), (2, NULL), (3, C) INSERT INTO #Target VALUES (1, A), (2, B), (3, NULL) -- 只更新值发生变化的行 UPDATE T SET T.Val S.Val FROM #Target T JOIN #Source S ON T.ID S.ID WHERE T.Val IS DISTINCT FROM S.Val与 NULL 直接比较IS [NOT] DISTINCT FROM也支持与字面量包括 NULL比较SELECT * FROM #TestData WHERE ColA IS NOT DISTINCT FROM NULL -- 等价于 ColA IS NULL SELECT * FROM #TestData WHERE ColA IS DISTINCT FROM NULL -- 等价于 ColA IS NOT NULL总结IS [NOT] DISTINCT FROM是 SQL Server 2022 中一个非常实用的语法补充解决了长期以来 NULL 值比较需要写冗长条件的问题。特别是在以下场景中推荐使用数据同步/对比时判断两列是否真正发生了变化参数化查询中参数值可能为 NULL 时的等值比较需要将 NULL NULL 视为相等的业务场景代码简洁语义明确值得在 SQL Server 2022 环境中推广使用。

更多文章