SQL Server CASE语句将字段放在CASE后IS NULL判断报错原因求解
CASE表达式空值判断报错原因说明
核心原因是SQL标准中定义了两种逻辑完全不同的CASE表达式语法
1. 简单CASE表达式(你第一种报错写法尝试使用的结构)
语法规则如下:
CASE 待比较的基础表达式 WHEN 匹配值1 THEN 返回结果1 WHEN 匹配值2 THEN 返回结果2 ... ELSE 默认返回结果 END
这种语法的执行逻辑是:将CASE关键字后跟随的表达式,依次和每个WHEN后的固定值做等值匹配,匹配到第一个相等的值就返回对应结果。
你报错的写法问题在于:IS NULL是SQL中用于空值判断的条件语法,不是一个可以用来做等值比较的固定值,完全不符合简单CASE表达式的语法要求,因此会抛出Incorrect syntax near the keyword 'is'的语法错误。
额外补充:哪怕你把第一种写法调整为CASE table1.indthrud WHEN NULL THEN 'Current'语法上不会报错,但逻辑也不会生效,因为SQL中NULL = NULL的运算结果是UNKNOWN,永远不会满足等值匹配的条件。
2. 搜索CASE表达式(你第二种正常运行的写法使用的结构)
语法规则如下:
CASE WHEN 布尔条件1 THEN 返回结果1 WHEN 布尔条件2 THEN 返回结果2 ... ELSE 默认返回结果 END
这种语法没有CASE后跟随的待比较表达式,每个WHEN后可以写任意合法的布尔判断条件(包括空值判断、范围判断、多字段组合判断等),只要条件返回TRUE就会执行对应的返回逻辑,因此你写table1.indthru is null是完全符合语法要求的。
扩展补充
如果一定要用简单CASE的结构实现空值判断,也可以借助空值处理函数做中转,示例如下:
SELECT *, CASE ISNULL(table1.indthrud, '^_^NULL_MARKER') WHEN '^_^NULL_MARKER' THEN 'Current' ELSE 'Historical' END Indicator FROM table1
不过这种写法可读性不如直接使用搜索CASE表达式,一般更推荐你第二种写法。
内容的提问来源于stack exchange,提问作者Syed Ali Ahmed Islam
相关产品推荐
相关产品推荐

