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

大家好,我是全栈小5,欢迎来到《小5讲堂》。

这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。

温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

目录

前言

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

所以,平时去积累一些技巧还是非常有必要的。

ISNULL用法

在 SQL Server 中,ISNULL 函数只接受两个参数,不支持三个参数的情况。

博主刚开始是这么用的 ISNULL(t11.ItemCode,'Y','N') ,这种写法是错误的。

ISNULL 函数的正确语法是:

sql 复制代码
ISNULL(check_expression, replacement_value)

case when用法

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

sql 复制代码
CASE WHEN t11.ItemCode IS NULL THEN 'Y' ELSE 'N' END

iif

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

sql 复制代码
IIF(t11.ItemCode IS NULL, 'Y', 'N')

查询小技巧

技巧一

使用 CONCAT 安全地拼接字符串

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

旧方法(有风险):

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

小技巧(使用 CONCAT):

sql 复制代码
SELECT CONCAT(FirstName, ' ', LastName) AS FullName
FROM Employees;

好处:

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

技巧二

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

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

旧方法(可能低效):

sql 复制代码
SELECT *
FROM Customers
WHERE CustomerID IN (
    SELECT DISTINCT CustomerID 
    FROM Orders 
    WHERE OrderDate > '2023-01-01'
);

小技巧(使用 EXISTS):

sql 复制代码
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】新手一分钟看懂在已有表基础上修改字段默认值和数据类型

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

相关推荐
necessary65339 分钟前
explain analyze和直接执行SQL时间相差10倍?
数据库
向宇it1 小时前
【Mysql知识】Mysql索引相关知识详解
数据库·mysql
文人sec2 小时前
性能测试-jmeter13-性能资源指标监控
数据库·测试工具·jmeter·性能优化·模块测试
摩羯座-185690305944 小时前
VVIC 平台商品详情接口高效调用方案:从签名验证到数据解析全流程
java·前端·数据库·爬虫·python
论迹4 小时前
【Redis】-- 分布式锁
数据库·redis·分布式
沉迷技术逻辑4 小时前
Redis-实现分布式锁
数据库·redis·缓存
小志开发5 小时前
SQL从入门到起飞:完整数据库操作练习
数据库·sql·学习·oracle·sqlserver·navicat
或与且与或非5 小时前
rust使用sqlx示例
开发语言·数据库·rust
王不忘.5 小时前
MySQL 数据库核心知识点详解
数据库·mysql
时序数据说5 小时前
时序数据库 IoTDB:支撑万亿级物联网设备的基石
大数据·数据库·物联网·时序数据库·iotdb