我正在尝试此查询:
Select * from users_t t
where
case when sysdate <= to_date('20130131', 'yyyymmdd')
then t.user_id=1254664
else t.user_id=1259753
End
为什么会发出“ORA-00905:缺少关键字”错误?
答案 0 :(得分:4)
您需要一个比较运算符 outside case
语句:
Select * from users_t t
where
(case when sysdate <= to_date('20130131', 'yyyymmdd')
then 254664
else 1259753
End) = t.user_id
但是,您可以在没有case
语句的情况下编写此代码:
select *
from users_t t
where ((sysdate <= to_date('20130131', 'yyyymmdd') and t.user_id = 254664) or
((sysdate > to_date('20130131', 'yyyymmdd') and t.user_id = 1259753)
答案 1 :(得分:3)
您的个案陈述不正确。
SELECT *
FROM users_t t
WHERE t.user_id = CASE WHEN SYSDATE <= TO_DATE('20130131', 'yyyymmdd')
THEN 1254664
ELSE 1259753
END
这将完成您的任务。
编辑:更好的格式化。
答案 2 :(得分:1)
SQL中的CASE
语句始终返回一个值。您需要将此CASE
语句等同于某些内容。阅读更多相关信息here。
您应该使用以下代码:
Select * from users_t t
where
t.user_id = case
when sysdate <= to_date('20130131', 'yyyymmdd')
then 1254664
else 1259753
End
答案 3 :(得分:0)
此错误的根本原因是Oracle SQL中没有布尔数据类型。 (我个人认为这是一个很大的错误。)
返回一个条件是一个非常有效的想法,它甚至适用于PL / SQL:
declare
v_test Boolean;
begin
v_test := case when 1=1 then 1=1 else 1=2 end;
end;
/