【问题标题】:SQL : Coalesce within where clause giving error Oracle (Not in DB2)SQL:在 where 子句中合并给出错误 Oracle(不在 DB2 中)
【发布时间】:2014-01-09 17:04:00
【问题描述】:

我尝试在 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

【问题讨论】:

  • to_date 调用中的“DAY”是什么意思?
  • 是的 LitteBobbyTables,我已经把这两个表达式都放在了 Coalesce 函数中。
  • 老程序员,我们正在从当前日期减去 3 天,并检查表上的日期是否在最近两天。
  • 为什么这个查询的等价物可以在 DB2 中工作? SELECT S.OPRID , A.OPRNAME , S.EMAIL_ADDR 从 TABLE1 S , TABLE2 A WHERE COALESCE(S.REHIRE_DT,S.ORIG_HIRE_DT) 在当前日期 - 3 天和当前日期 - 1 天和 S.EMPLSTATUS = 'A' 之间A.EMPLID = S.EMPLID 由 S.OPRID 订购
  • 我看到这个错误弹出是为了告诉用户你有太多括号,而不是你实际上缺少一个。

标签: sql oracle date coalesce


【解决方案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

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-09
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多