You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 19:06:00