ORA-00920:使用案例时无效的关系运算符

时间:2017-05-25 11:16:52

标签: sql oracle

我正在使用oracle开发人员编写代码来查找是否有连续3天的设备登录,我正在使用案例函数编写代码,但它给了我无效的关系运算符错误。我不知道我错在哪里。

提前致谢

SELECT *FROM
(SELECT a.*,substr(TEXT_USERNAME,2,length(TEXT_USERNAME)-2), row_number() 
over (partition by trunc(DTIME_LOGIN) order by TEXT_USERNAME ) rn

 FROM 
  OWNER_DWH.F_HOSEL_USER_LOGIN_TT a)

 WHERE

  (CASE WHEN trunc(dtime_login)=trunc(sysdate-1) then  'y'
  ELSE 'n' END ) D1
  and 
   (CASE WHEN trunc(dtime_login)=trunc(sysdate-2) then  'y'
  ELSE 'n' END) D2
  and 
   (CASE WHEN trunc(dtime_login)=trunc(sysdate-3) then  'y'
  ELSE 'n' END) D3

2 个答案:

答案 0 :(得分:1)

这可以修复语法错误。但代码将不返回任何行,因为您的逻辑错误:

WHERE 'y' = (CASE WHEN trunc(dtime_login) = trunc(sysdate-1) then 'y' ELSE 'n' END) AND
      'y' = (CASE WHEN trunc(dtime_login) = trunc(sysdate-2) then 'y' ELSE 'n' END) AND
      'y' = (CASE WHEN trunc(dtime_login) = trunc(sysdate-3) then 'y' ELSE 'n' END)

我建议您向另一个问题询问样本数据和所需结果,并明确说明您想要完成的任务。

答案 1 :(得分:0)

在编写查询时,您询问的是数据问题。谓词或where子句是限制要返回的行的特定问题。这......

(CASE WHEN trunc(dtime_login)=trunc(sysdate-1) then  'y'
      ELSE 'n' END ) D1

...实际上是一个有效的谓词。在这里,您运行的CASE statemtent将返回一个值,但该值永远不会与常量或其他值进行比较。相反,您似乎尝试分配一个别名,该别名仅适用于选择列。

也许您正在考虑以下内容。在这里,评估CASE语句,并根据值' y'测试结果值。

(CASE WHEN trunc(dtime_login)=trunc(sysdate-1) then  'y'
      ELSE 'n' END ) = 'y'