假设有一个这样的表结构
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 |
有没有解决的办法。使用任何其他方法都会产生相同的结果。
答案 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;
这使查询更加冗长,但保留了谓词转换中可能丢失的意图。