SQL Case语句丢失关键字错误

时间:2013-04-17 18:21:53

标签: sql oracle oracle10g oracle11g

我正在尝试此查询:

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:缺少关键字”错误?

4 个答案:

答案 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;
/