在案例声明中设置条件

时间:2019-06-07 07:38:32

标签: sql oracle

假设有一个这样的表结构

Name | Class | CS_ex_date | IT_ex_date|

xyz  | CSE   | 10 june    |  Null     |
123  | ECE   | Null       |  Null     |
456  | MECH  | Null       |  Null     |
678  | MECH  | Null       |  Null     |
abc  | IT    | Null       | 3 Aug     |

我想使用case语句创建一个select语句,并且case语句中有一些条件。

我已经看到case语句和case语句在何处有条件的常规语法,但是我想在THEN部分中放入一些条件。我的语法有问题,找不到任何示例可供参考。

我的查询是这样的:

select * 
  from student 
 where (case 
          when class like '%SE%' 
            then CS_ex_date > sysdate and CS_ex_date < sysdate + 60
          when class like '%T%' 
            then IT_ex_date > sysdate and IT_ex_date < sysdate + 60 
        end);

我不确定查询的语法并得到ORA-00905:缺少关键字。

预期输出应为

Name | Class | CS_ex_date | IT_ex_date|

xyz  | CSE   | 10 june    |  Null    |
abc  | IT    | Null       | 3 Aug    |

有没有解决的办法。使用任何其他方法都会产生相同的结果。

2 个答案:

答案 0 :(得分:1)

似乎您想要or,而不是case

select * 
  from student 
 where (class like '%SE%' and CS_ex_date > sysdate and CS_ex_date < sysdate + 60) or
       (class like '%T%'  and IT_ex_date > sysdate and IT_ex_date < sysdate + 60)

答案 1 :(得分:0)

您可以使用CASE语句来计算与子查询中的谓词相关的值,而不是在WHERE条件下使用它:

with student_dt as
(select 
   student.*,
   case 
          when class like '%SE%' 
            then CS_ex_date  
          when class like '%T%' 
            then IT_ex_date  
        end as check_date
  from student)
select * from  student_dt 
 where check_date > sysdate and check_date < sysdate + 60; 

这使查询更加冗长,但保留了谓词转换中可能丢失的意图。