Oracle SQL中CASE语句为何不能保留空值?报错ORA-00920
ORA-00920错误分析与解决(CASE语句空值问题)
错误原因
你写的CASE语句里,WHEN '' AND CS.START <> '99'这类写法存在语法错误:
- Oracle中
''等价于NULL,而单独的''没有和任何字段做比较操作,直接跟AND不符合SQL语法规范,这才是触发ORA-00920: INVALID RELATIONAL OPERATOR的根本原因,并非“无法保留空值”的问题。 - 另外Oracle里判断空值不能用
= ''或<>,必须用IS NULL/IS NOT NULL,因为''本质就是NULL,= NULL这类表达式永远不成立。
解决方法
首先明确你的业务逻辑:如果是想判断某个字段为空的情况,需要把空值判断补全。比如假设你是想判断CS.COLUMN_NAME为空时执行后续条件,修正后的语句如下:
SELECT CASE -- 当指定字段为空且START不等于'99'时返回CSE WHEN CS.COLUMN_NAME IS NULL AND CS.START <> '99' THEN 'CSE' -- 当指定字段为空且START等于'99'时返回ECE WHEN CS.COLUMN_NAME IS NULL AND CS.START = '99' THEN 'ECE' -- 当另一字段为空且START不等于'99'时返回CIVIL_E WHEN CS.OTHER_COLUMN IS NULL AND CS.START <> '99' THEN 'CIVIL_E' -- 所有条件不满足时默认返回NULL(可省略,CASE默认返回NULL) ELSE NULL END AS STREAM FROM C_STREAM CS
如果你的需求是“当没有匹配的WHEN条件时保留空值”,CASE语句本身就会默认返回NULL,不需要额外处理。
内容的提问来源于stack exchange,提问作者DIVYANSHU SINGH
相关产品推荐
相关产品推荐

