美好的一天 Stackoverflow!
我有一个查询给我一个错误:“ 缺少右括号 ”,至少,SQL Developer 是这样说的。
我的查询在 WHERE 子句中有一个 CASE 语句,它接受一个参数,然后根据输入的值执行一个条件。
我读过在 WHERE 子句中使用 CASE 语句时,您必须用括号将语句括起来并将其分配给一个数值,例如“1”,但是这样做并不能实现我的目标。
我的目标是在满足条件时执行 CASE 语句中的条件。
你介意看看并给我一些意见吗?
谢谢!
SELECT ...
FROM ....
WHERE 1 = 1
AND (
CASE :P_REPORT_PERIOD
WHEN 'SPRING'
THEN ((fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))-1) AND period >=10) OR (fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))) AND period < 4))
WHEN 'FALL'
THEN ((fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))) AND period >=4) OR (fiscal_year = (EXTRACT(YEAR FROM (SYSDATE))) AND period < 10))
END
) = 1
最佳答案
问题已解决,感谢所有试图找到解决方案的人。
解决方案:我没有使用 CASE 语句,而是创建了一个存储过程,用 IF 替换了 CASE,并根据我的查询构建了一个 VSQL 字符串。
示例:VSQL := 'SELECT.....'
IF (v_rpt_pd = 'SPRING') THEN
VSQL := VSQL || '( ( AND EXTRACT(YEAR FROM (SYSDATE))-1 = fiscal_year and period >=10) or ';
VSQL := VSQL || ' ( AND EXTRACT(YEAR FROM (SYSDATE)) = fiscal_year and period <=3) )';
ELSE
VSQL := VSQL || '( ( AND EXTRACT(YEAR FROM (SYSDATE)) = fiscal_year and period >=4) or ';
VSQL := VSQL || ' ( AND EXTRACT(YEAR FROM (SYSDATE)) = fiscal_year and period <=9) )';
END IF;
VSQL := VSQL ||' GROUP BY fiscal_year, period
依此类推,如果您想要整个解决方案,请私信我,我会将代码发送给您。
干杯!
关于plsql - PL/SQL 在 WHERE 子句中使用 CASE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709619/