SQL Developer中Oracle的WHERE子句使用带IN的CASE语句语法问题
你的写法不符合Oracle语法的核心原因是:Oracle不支持在CASE表达式的THEN分支返回布尔值,也不允许CASE表达式的结果直接作为WHERE的判断条件使用,你可以选择以下两种方案改写:
方案1:用逻辑与或组合(推荐,性能更优)
直接通过AND+OR组合判断条件,代码更简洁,优化器也更容易生成最优执行计划:
WHERE (p_Type = 0 AND AccCode IN (130,131)) OR (p_Type = 1 AND AccCode IN (230,231))
方案2:CASE表达式改写(适合需要复杂分支判断的场景)
如果确实需要用CASE实现分支逻辑,可以让CASE返回可比较的数值/字符串,再和固定值匹配:
WHERE CASE WHEN p_Type = 0 AND AccCode IN (130,131) THEN 1 WHEN p_Type = 1 AND AccCode IN (230,231) THEN 1 ELSE 0 END = 1
其他存储过程语法修正
你贴的存储过程还有两处语法问题需要修正:
- Oracle存储过程中不支持直接写SELECT语句,必须通过
INTO子句赋值给变量,或者用游标返回结果集 - 不要用
Type作为参数名,它是Oracle的保留关键字,容易触发不可预期的错误
以下是完整的可运行修正版示例,用REF CURSOR返回查询结果:
CREATE OR REPLACE PROCEDURE Test ( p_Type IN NUMBER, p_result OUT SYS_REFCURSOR ) AS BEGIN OPEN p_result FOR SELECT Id, Name, AccCode FROM myTable WHERE (p_Type = 0 AND AccCode IN (130,131)) OR (p_Type = 1 AND AccCode IN (230,231)); END Test; /
内容的提问来源于stack exchange,提问作者Mina Yazdani
相关产品推荐
相关产品推荐

