当前位置: 首页 > news >正文

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 环境中推广使用。

http://www.jsqmd.com/news/643403/

相关文章:

  • 手把手教学:用DeerFlow的Web界面轻松进行多轮研究对话
  • Cogito-v1-preview-llama-3B效果对比:在ChineseGLUE榜单全面领先
  • AI绘画小白必看:Z-Image-Turbo-辉夜巫女快速上手攻略
  • GTE-Base-ZH与LaTeX文档处理:智能编排学术论文参考文献
  • H3C IRF部署与排障实战指南:从端口绑定到配置一致性
  • 如何在CSS中正确加载本地JPG背景图片
  • OFA-Image-Caption效果对比评测:与CLIP、BLIP等主流图像描述模型对比
  • RexUniNLU新手教程:用统一模型同时做实体识别和情感分析,处理爬虫数据不再难
  • 智慧医疗中的诊断辅助与健康管理
  • 【AI Agent】AI Agent 智能体系统性知识体系
  • 扣子(Coze)进阶:AI赋能历史教育!打造沉浸式历史人物互动视频教程
  • 51单片机+ESP8266 MQTT协议下的智能火灾报警系统实战与内存优化
  • Autoware实车部署避坑指南(一)-- 从零搭建矢量地图与Unity工具链实战
  • 文墨共鸣大模型操作系统原理辅助教学:图解进程管理与文件系统
  • 别再为服务器账单发愁!元域资源调度与成本优化的三层架构实战
  • YOLO12多尺度检测效果展示:同一图像不同分辨率输入结果对比图集
  • 嵌入式工程师必看:用STM32CubeMX配置RMII以太网PHY的完整流程(以LAN8720A为例)
  • Windows本地AI新玩法:Docker Compose一键部署Ollama与Open WebUI,小白也能玩转私有大模型
  • 别再死记硬背了!用MATLAB动画演示,5分钟搞懂2ASK、2FSK、2PSK、2DPSK相干解调区别
  • CasRel开源可部署价值:替代商业NLP平台,年节省知识图谱构建成本超80%
  • Wan2.2-I2V-A14B性能测试:对比不同算法下的视频生成速度与质量
  • 光伏发电量计算中的辐照度标准解析与应用
  • 4月15日成都地区攀成钢产无缝钢管(8163-20#;外径20-108mm)现货报价 - 四川盛世钢联营销中心
  • 保姆级教程:用Python 3.6和pymilvus 1.1.0搞定Milvus向量数据库的增删改查
  • 重磅曝光!GPT-6 即将登场
  • 告别两阶段!用单个冻结的ConvNeXt-Large CLIP,7.5倍速搞定开放词汇分割(附代码)
  • 杰理之spi推灯有概率出现不亮灯【篇】
  • 理解CAP定理与BASE理论:分布式系统的理论基础
  • 概率论_深入解析概率公式中的符号:逗号(,)、竖线(|)、分号(;)及其运算优先级
  • 从零到一:基于Vue3、Electron与Vite的现代化桌面应用实战指南