这是一个简单的问题,我已经阅读了有关在CASE
子句中使用WHERE
的一些细节,但无法清楚地了解如何使用它。以下是我的示例查询:
1 SELECT * FROM dual
2 WHERE (1 =1)
3 AND (SYSDATE+1 > SYSDATE)
4 AND (30 > 40)
5 AND (25 < 35);
我在参数中有一个程序i_value
。
如果i_value为'S',我需要忽略第4行,如果i_value为'T',我需要忽略第5行。
提前致谢。
答案 0 :(得分:2)
SELECT * FROM dual
WHERE (1 =1)
AND (SYSDATE+1 > SYSDATE)
AND CASE WHEN i_value = 'S' THEN 1 ELSE CASE WHEN (30 > 40) THEN 1 ELSE 0 END END = 1
AND CASE WHEN i_value = 'T' THEN 1 ELSE CASE WHEN (25 < 35) THEN 1 ELSE 0 END END = 1;
答案 1 :(得分:2)
我认为这是解决问题的最佳方法:
select *
from dual
where (1 = 1)
and (sysdate + 1 > sysdate)
and case
when i_value = 'S'
then
case
when (25 < 35)
then 1
else 0
end
when i_value = 'T'
then
case
when (30 > 40)
then 1
else 0
end
end = 1;
当然,您可以使用动态SQL,但它会更难,效率更低。
答案 2 :(得分:1)
为什么所以ser 使用case
?
SELECT * FROM dual
WHERE (1 =1)
AND ( SYSDATE+1 > SYSDATE )
AND ( ((30 > 40) and i_value <> 'S') or i_value = 'S' )
AND ( ((25 < 35) and i_value <> 'T') or i_value = 'T' );
答案 3 :(得分:-1)
这应该也可以。
case
when (i_value = 'S' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (25 < 35)) ) then 1
when (i_value = 'T' and (WHERE (1=1) AND (SYSDATE+1 > SYSDATE) AND (30 < 40)) ) then 1
else 0
end = 1