Plsql PL/SQL在WHERE子句中使用CASE
日安 我有一个查询给了我一个错误:“缺少右括号””,至少SQL开发人员这样说 我的查询在WHERE子句中有一个CASE语句,它接受一个参数,然后根据输入的值执行一个条件 我已经读到,当在WHERE子句中使用CASE语句时,必须用括号将语句括起来,并将其指定给一个数值,例如“1”,但是这样做并不能实现我的目标 我的目标是在满足条件的情况下执行CASE语句中的条件 请你看一下,给我一些意见好吗 谢谢Plsql PL/SQL在WHERE子句中使用CASE,plsql,case-statement,Plsql,Case Statement,日安 我有一个查询给了我一个错误:“缺少右括号””,至少SQL开发人员这样说 我的查询在WHERE子句中有一个CASE语句,它接受一个参数,然后根据输入的值执行一个条件 我已经读到,当在WHERE子句中使用CASE语句时,必须用括号将语句括起来,并将其指定给一个数值,例如“1”,但是这样做并不能实现我的目标 我的目标是在满足条件的情况下执行CASE语句中的条件 请你看一下,给我一些意见好吗 谢谢 SELECT ... FROM .... WHERE 1 = 1 AND
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
选择。。。
从…起
其中1=1
及(
案例:P_报告期
当‘春天’
然后((会计年度=(摘录(自(系统日期起的年度))-1)和期间>=10)或(会计年度=(摘录(自(系统日期起的年度))和期间<4))
当‘坠落’
然后((会计年度=(摘录(从(系统日期)算起的年度))和期间>=4)或(会计年度=(摘录(从(系统日期算起的年度))和期间<10))
结束
) = 1
由于所有试图找到解决方案的人,问题得以解决
解决方案:我没有使用CASE语句,而是创建了一个存储过程,用IF替换了CASE,并从查询中构建了一个VSQL字符串
示例:
VSQL:=“选择…”
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
如果(v_rpt_pd='SPRING'),那么
VSQL:=VSQL | |'((和提取(从(SYSDATE)开始的年份))-1=会计年度和期间>=10)或';
VSQL:=VSQL | |'(并提取(从(SYSDATE)开始的年份))=会计年度和期间=4)或';
VSQL:=VSQL | |'(并根据WHERE子句中的CASE
语法提取(从(SYSDATE)开始的年份))=会计年度和期间
--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