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

【数据库】Sql Server数据库中isnull、iif、case when三种方式的使用和空值判断

大家好,我是全栈小5,欢迎来到《小5讲堂》。
这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 前言
  • ISNULL用法
  • case when用法
  • iif
  • 查询小技巧
    • 技巧一
    • 技巧二
  • 文章推荐

前言

有时候数据库你接触多了,就会知道一些技巧,说实在有时候博主没有接触到,我可能还是会用普通方式去判断,这样就会存在漏数据的情况。
所以,平时去积累一些技巧还是非常有必要的。

ISNULL用法

在 SQL Server 中,ISNULL 函数只接受两个参数,不支持三个参数的情况。
博主刚开始是这么用的 ISNULL(t11.ItemCode,'Y','N') ,这种写法是错误的。

ISNULL 函数的正确语法是:

ISNULL(check_expression, replacement_value)

case when用法

如果需要实现类似三个参数的功能(当字段为 NULL 时返回 ‘Y’,否则返回 ‘N’),可以使用 CASE WHEN 表达式:

CASE WHEN t11.ItemCode IS NULL THEN 'Y' ELSE 'N' END

iif

或者使用更简洁的 IIF 函数(SQL Server 2012 及以上版本支持):

IIF(t11.ItemCode IS NULL, 'Y', 'N')

查询小技巧

技巧一

使用 CONCAT 安全地拼接字符串

问题: 传统的用加号 + 拼接字符串时,如果任何一个字段为 NULL,整个结果都会变成 NULL

旧方法(有风险):

SELECT FirstName + ' ' + LastName AS FullName
FROM Employees;
-- 如果 FirstName 或 LastName 为 NULL,FullName 就会显示为 NULL

小技巧(使用 CONCAT):

SELECT CONCAT(FirstName, ' ', LastName) AS FullName
FROM Employees;

好处:

  • CONCAT 函数会自动将 NULL 值视为空字符串 '' 来处理。
  • 即使 FirstNameLastName 为 NULL,其他部分依然会正常拼接,最终结果不会是 NULL。
  • 代码更简洁易读。

技巧二

使用 EXISTS 代替 IN 来检查存在性

问题: 当使用 IN 子查询时,数据库需要先执行整个子查询,返回所有结果集,然后再进行主查询和子查询结果的匹配,如果子查询结果集很大,性能会较差。

旧方法(可能低效):

SELECT *
FROM Customers
WHERE CustomerID IN (SELECT DISTINCT CustomerID FROM Orders WHERE OrderDate > '2023-01-01'
);

小技巧(使用 EXISTS):

SELECT *
FROM Customers c
WHERE EXISTS (SELECT 1 FROM Orders o WHERE o.CustomerID = c.CustomerID AND o.OrderDate > '2023-01-01'
);

好处:

  • 性能更高EXISTS 是一种关联子查询,一旦找到一条满足条件的记录就会立即返回 True 并停止搜索,避免了处理整个子查询结果集。
  • 语义更清晰EXISTS 直接表达了“是否存在”的逻辑意图。
  • 在子查询结果集很大时,性能提升尤为明显。

这两个技巧一个侧重于数据的可靠性和整洁性,另一个侧重于查询的性能优化,都是日常开发中非常实用的“利器”。

文章推荐

【数据库】Sql Server数据库中isnull、iif、case when三种方式的使用和空值判断

【数据库】如何使用一款轻量级数据库SqlSugar进行批量更新,以及查看最终的Sql操作语句

【数据库】使用Sql Server将分组后指定字段的行数据转为一个字段显示,并且以逗号隔开每个值,收藏不迷路

【数据库】SQL Server 查询条件小技巧:ISNULL 函数的使用,有请DeepSeek来辅助讲解下

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

【Sql Server】使用row_number over方式进行表分页,数据量达到五千多条记录后,查询变慢需要20多秒的解决方案

【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用

【Sql Server】锁表如何解锁,模拟会话事务方式锁定一个表然后进行解锁

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

【Sql Server】Update中的From语句,以及常见更新操作方式

【Sql server】假设有三个字段a,b,c 以a和b分组,如何查询a和b唯一,但是c不同的记录

【Sql Server】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

http://www.dtcms.com/a/361445.html

相关文章:

  • docker本地部署dify,nginx80端口占用的报错
  • Spring Ioc —— 集合类型的依赖注入
  • js语言编写科技风格博客网站-详细源码
  • LINUX驱动篇(二)驱动开发
  • 埃文科技荣获2025年“数据要素×”大赛河南分赛二等奖
  • FPGA时序约束(二)--做时序约束,本质上是在干嘛
  • 新闻资讯|基于微信小程序的经济新闻资讯系统设计与实现(源码+数据库+文档)
  • ARM-进阶汇编指令
  • 基于AI与物联网的中央空调节能调控系统
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • Android修改进程优先级
  • 在IDEA里使用Google Java Format
  • UART控制器——ZYNQ学习笔记14
  • 解决Content Security Policy (CSP)问题
  • Sparse4Dv3 部署到 TensorRT-(1)
  • Gradle vs. Maven,Java 构建工具该用哪个?
  • Paimon MergeTreeWrite、Compaction 和 快照构建
  • 嵌入式解谜日志之Linux操作系统—进程间的通信(IPC):无名管道,有名管道,信号通信5
  • 单片机元件学习
  • 【stm32】定时器(超详细)
  • Git安装教程
  • 【51页PPT】智慧社区解决方案(附下载方式)
  • 审美积累 | 金融类 SaaS 产品落地页设计
  • Empire: LupinOne靶场渗透
  • 贪心算法解决固定长度区间覆盖问题:最少区间数计算
  • CICD实战(2) - 使用Arbess+GitLab+SonarQube实现Java项目快速扫描/构建/部署
  • 【MySQL详解】索引、事务、锁、日志
  • 【C++上岸】C++常见面试题目--数据结构篇(第十六期)
  • 科学研究系统性思维的方法体系:数据收集
  • 11,FreeRTOS队列理论知识