SQL:在where子句中合并,给出错误Oracle(不在DB2中)

时间:2013-12-20 19:02:37

标签: sql oracle date coalesce

我试图在WHERE子句中使用COALESCE,我收到以下错误:

  

ORA-00907:缺少右括号失败的SQL stmt:

如果我删除了COALESCE,我就不会再收到错误了。我不知道为什么它会给我这个错误,因为括号似乎是正确的。这是我的SQL语句:

SELECT S.OPRID, A.OPRNAME, S.EMAIL_ADDR
FROM TABLE1 S, TABLE2 A
WHERE COALESCE(S.REHIRE_DT,S.ORIG_HIRE_DT)
        BETWEEN (TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM- DD'),'YYYY-MM-DD') - 3 DAY)
            AND (TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD') - 1 DAY)
AND S.EMPLSTATUS = 'A'
AND A.EMPLID     = S.EMPLID
ORDER BY S.OPRID

1 个答案:

答案 0 :(得分:1)

取出“DAY”字样。这不是以这种方式在oracle中使用的:

SELECT S.OPRID, A.OPRNAME, S.EMAIL_ADDR
FROM TABLE1 S, TABLE2 A
WHERE COALESCE(S.REHIRE_DT,S.ORIG_HIRE_DT)
        BETWEEN (TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM- DD'),'YYYY-MM-DD') - 3 )
            AND (TO_DATE(TO_CHAR(SYSDATE,'YYYY-MM-DD'),'YYYY-MM-DD') - 1 )
AND S.EMPLSTATUS = 'A'
AND A.EMPLID     = S.EMPLID
ORDER BY S.OPRID

“DAY”是要用作EXTRACT功能一部分的关键字 - 请参阅Here 日期字段的默认减法单位已经是以天为单位。我不熟悉DB2,但我假设您对DAY的使用是特定于DB2的属性。那可能不是可移植的SQL。是的,oracle的错误消息有时会让人感到困惑。

现在我考虑一下,你可以用以下内容替换所有“TO_DATE”内容:

BETWEEN TRUNC(SYSDATE)-3 AND TRUNC(SYSDATE)-1