2

我正在尝试这个查询:

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

4 回答 4

4

您需要语句之外的比较运算符: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)
于 2013-04-17T18:24:02.850 回答
3

您的案例陈述不正确。

SELECT * 
FROM users_t t
WHERE t.user_id = CASE WHEN SYSDATE <= TO_DATE('20130131', 'yyyymmdd')
                       THEN 1254664
                       ELSE 1259753
                  END

这将完成您的任务。

编辑:更好的格式。

于 2013-04-17T18:24:03.210 回答
1

SQL 中的CASE语句总是返回一个值。您需要将此CASE声明等同于某事。在此处阅读更多相关信息。

您应该使用以下代码:

Select * from users_t t
where
t.user_id = case
                 when sysdate <= to_date('20130131', 'yyyymmdd')
                 then 1254664
                 else 1259753
            End
于 2013-04-17T18:24:02.317 回答
0

这个错误的根本原因是Oracle SQL 中没有布尔数据类型。(我个人认为这是一个巨大的错误。)

返回条件是一个完全有效的想法,它甚至可以在 PL/SQL 中使用:

declare
    v_test Boolean;
begin
    v_test := case when 1=1 then 1=1 else 1=2 end;
end;
/
于 2013-04-17T20:07:35.007 回答