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】:

THENELSE 之后的子查询必须用括号括起来:

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……

oracle中case when使用

oracle 中 sql 应用case when 提示数字无效问题。高手指点迷津!!!!

Oracle CASE WHEN函数用法

Oracle CASE WHEN函数用法

oracle 中case when then 字符串