美好的一天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
答案 0 :(得分:1)
解决了问题,感谢那些试图找到解决方案的人。
解决方案:我没有使用CASE语句,而是创建了一个存储过程,将CASE替换为IF并从我的查询中构建了一个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
等等,如果你想要整个解决方案,DM我和我都会发给你代码。
干杯!
答案 1 :(得分:0)
根据Tom ,CASE
中的WHERE CLAUSE
语法为 -
--Syntax
select * from <table name>
where 1=1
and
(case
when <BOOLEAN_EXPRESSION>
then <SCALAR_RETURN_VALUE>
...
ELSE <SCALAR_RETURN_VALUE>
end) = <SCALAR_VALUE> ;
示例:强>
--Query
WITH SAMPLE_DATA AS
(select 100 COL1,999 COL2 from DUAL UNION ALL
select 200 COL1,888 COL2 from DUAL
)
SELECT * FROM SAMPLE_DATA
WHERE 1=1
AND (
CASE COL2
WHEN 999 THEN 1
ELSE 0
END
) = 1 ;
-- Output:
100 999