Where 子句案例陈述; ORA-00907: 缺少括号
Posted
技术标签:
【中文标题】Where 子句案例陈述; ORA-00907: 缺少括号【英文标题】:Where Clause Case Statement; ORA-00907: missing parenthesis 【发布时间】:2013-08-28 09:28:12 【问题描述】:我有一个查询,当我运行它时,我收到错误消息 ORA-00907:缺少括号。当我将 CASE 语句替换为 x = g and 或 y = g and 时,它会按预期运行。
SELECT *
FROM
table1,
table2,
table3,
table4,
table5,
table6,
table7,
table8
WHERE
a = b and
c = d and
e = d and
CASE strfldvar
WHEN 'BROKEN_ARROW' THEN (x = g)
WHEN 'BROKEN_BOX' THEN (y = g)
ELSE -1
end
and
f = h and
i = j
我在这里做错了什么?
【问题讨论】:
【参考方案1】:case
是一个表达式,而不是一个谓词(即条件):它“返回”一个类型化的值,并且不能包含谓词作为结果(在 then
部分中)。在您的情况下(假设 else -1
表示“不匹配”):
AND g = CASE strfldvar
WHEN 'BROKEN_ARROW' THEN x
WHEN 'BROKEN_BOX' THEN y
ELSE NULL -- never match, even if g is null
END
虽然我认为将其替换为:
AND (
(strfldvar = 'BROKEN_ARROW' AND x = g)
OR (strfldvar = 'BROKEN_BOX' AND y = g)
)
【讨论】:
【参考方案2】:代替
CASE strfldvar
WHEN 'BROKEN_ARROW' THEN (x = g)
WHEN 'BROKEN_BOX' THEN (y = g)
ELSE -1
有这个:
x=CASE strfldvar WHEN 'BROKEN_ARROW' THEN g ELSE x END
y=CASE strfldvar WHEN 'BROKEN_ARROW' THEN g ELSE y END
【讨论】:
【参考方案3】:我会替换
CASE strfldvar
WHEN 'BROKEN_ARROW' THEN (x = g)
WHEN 'BROKEN_BOX' THEN (y = g)
ELSE -1
通过
(CASE WHEN strfldvar = 'BROKEN_ARROW' and x = g then 1
WHEN strfldvar = 'BROKEN_BOX' and y = g then 1
ELSE -1
END) = 1
【讨论】:
以上是关于Where 子句案例陈述; ORA-00907: 缺少括号的主要内容,如果未能解决你的问题,请参考以下文章
SQL 错误:ORA-00907:缺少右括号 00907。00000 -“缺少右括号”
错误报告 - ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号