Oracle中CASE判断NULL值失效 查询结果全部返回Closed
问题根因
语句执行结果不符合预期的核心原因是Oracle(所有标准SQL数据库同理)中,NULL值无法通过等值比较判断:
- 你使用的是CASE简单表达式,写法
CASE Account_Close_Date WHEN NULL THEN 'Open'底层逻辑等价于判断Account_Close_Date = NULL - SQL中任意值和NULL做
=等值比较,返回结果永远不是TRUE,因此这个分支永远不会被命中,所有记录都会走ELSE分支返回Closed
修正方案
两种可正常运行的写法:
写法1:标准搜索型CASE表达式(通用所有SQL数据库)
用IS NULL做NULL值判断,这是SQL标准规定的NULL判断语法:
select CASE WHEN Account_Close_Date IS NULL THEN 'Open' ELSE 'Closed' END as Status, Account_Close_Date from customer_account_Table
写法2:用Oracle内置NVL2函数(Oracle专属简洁写法)
NVL2(字段, 非空返回值, 空返回值)是Oracle专门处理空值判断的内置函数,刚好匹配当前业务逻辑:
select NVL2(Account_Close_Date, 'Closed', 'Open') as Status, Account_Close_Date from customer_account_Table
异常执行结果参考

内容的提问来源于stack exchange,提问作者Little_Tomato
相关产品推荐
相关产品推荐

