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)

如果不处理NULL:

复制代码
SELECT *
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 B:A 和 B 相等(NULL = NULL 视为相等),等价于 (A = B) OR (A IS NULL AND B IS NULL)
  • A IS DISTINCT FROM B:A 和 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 值比较需要写冗长条件的问题。特别是在以下场景中推荐使用:

  1. 数据同步/对比时,判断两列是否真正发生了变化
  2. 参数化查询中,参数值可能为 NULL 时的等值比较
  3. 需要将 NULL = NULL 视为相等的业务场景

代码简洁,语义明确,值得在 SQL Server 2022 环境中推广使用。

相关推荐
wno7046 小时前
postgresSQL压缩版安装与基本命令
数据库·postgresql
聚美智数8 小时前
智能结构化识别-图片结构解析-图像结构化解析-照片结构化解析
android·java·数据库
瀚高PG实验室8 小时前
瀚高数据库常用系统表查询入门指南(附常用SQL)
数据库·sql·postgresql·瀚高数据库
ben9518chen8 小时前
mysql数据库基本操作
数据库·mysql
2603_965148119 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
土豆.exe9 小时前
nf_tables 的 verdict 被读了两次:一个十年未闭合的位域错配
java·数据库·网络安全·缓存
缓慢更新9 小时前
表单引擎的存储建模:宽表与文档库的取舍
运维·服务器·网络·数据库·低代码·oracle·适配器模式
Web3&Basketball11 小时前
实测Gemini4Argon:ERQA 87%登顶长程任务榜
数据库·python·大模型·多模态·gemini·长上下文·推理优化
xiaogai_gai11 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
注塑机数据采集联网11 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析