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

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

相关推荐
VIP_CQCRE7 小时前
身份证识别及信息核验 API 对接说明
java·前端·数据库
VIP_CQCRE7 小时前
Veo Videos Generation API 对接说明
java·服务器·数据库
罗光记8 小时前
Ubuntu 25.10 Snapshot4 发布。
数据库·百度·微信·facebook·segmentfault
程序员的世界你不懂9 小时前
【Django】首次创建Django项目初始化
数据库·django·sqlite
代码的余温9 小时前
PostgreSQL WAL机制深度解析与优化
数据库·postgresql
Jacob023410 小时前
Postgres 和 MySQL 应该怎么选?
数据库·mysql·postgresql
我想起个名字10 小时前
旧实例数据库损坏sqlserver启动失败解决办法
数据库·sqlserver
过期动态10 小时前
MySQL内置的各种单行函数
java·数据库·spring boot·mysql·spring cloud·tomcat
Databend10 小时前
存算分离架构重塑政务数据治理:福建大数据基于 Databend 构建一体化公共数据平台的实践探索
数据库