我正在使用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
答案 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'