【问题标题】:Oracle CASE WHEN - ORA-00936: missing expressionOracle CASE WHEN - ORA-00936:缺少表达式
【发布时间】: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...

标签: oracle plsql


【解决方案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吗?
猜你喜欢
  • 2017-08-31
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多