Oracle CASE WHEN - ORA-00936:缺少表达式
Posted
技术标签:
【中文标题】Oracle CASE WHEN - ORA-00936:缺少表达式【英文标题】:Oracle CASE WHEN - ORA-00936: missing expression 【发布时间】:2019-09-24 19:39:03 【问题描述】:我是 oracle 新手,下面是我的 SQL。
SELECT * FROM TABLE1 WHERE COLUMN1 = 'YES'
AND COLUMN2 IN (
CASE WHEN EXISTS(SELECT * FROM TABLE1 WHERE COLUMN1 = 'YES' AND COLUMN2 NOT LIKE '%NO%')
THEN
SELECT COLUMN2 FROM TABLE1 WHERE COLUMN1 = 'YES' AND COLUMN2 NOT LIKE '%YES%'
ELSE
SELECT COLUMN2 FROM TABLE1 WHERE COLUMN1 = 'YES' AND COLUMN2 NOT LIKE '%YES%' END)
它给出 ORA-00936: 在 then 语句中缺少表达式。我做错了什么?
【问题讨论】:
如果您只评估存在,则不应返回整个数据集。考虑使用这样的东西:CASE WHEN EXISTS(SELECT 'TRUE' FROM TABLE1...
【参考方案1】:
THEN
和ELSE
之后的子查询必须用括号括起来:
SELECT * FROM TABLE1 WHERE COLUMN1 = 'YES'
AND COLUMN2 IN (
CASE
WHEN EXISTS (SELECT * FROM TABLE1 WHERE COLUMN1 = 'YES' AND COLUMN2 NOT LIKE '%NO%')
THEN (SELECT COLUMN2 FROM TABLE1 WHERE COLUMN1 = 'YES' AND COLUMN2 NOT LIKE '%YES%')
ELSE (SELECT COLUMN2 FROM TABLE1 WHERE COLUMN1 = 'YES' AND COLUMN2 NOT LIKE '%YES%')
END
)
仅当这些子查询返回的行数不超过 1 行时,这才有效。
此外,两个子查询是相同的。这是笔误吗?
并且IN
可以更改为=
,因为CASE
只返回1 个值。
【讨论】:
如果返回超过 1 行,我该如何写?我可以使用 IF ExISTS 吗? 你不能。 CASE 只返回 1 个值 好的,我可以使用 EXISTS 吗?并返回多个值? EXISTS 返回 TRUE 或 FALSE。它不返回行。 检查存在后,可以写then和else吗?以上是关于Oracle CASE WHEN - ORA-00936:缺少表达式的主要内容,如果未能解决你的问题,请参考以下文章
oracle case的这种写法怎么对应多个值 case x when……