我正在编写一个查询来提取员工和帐户信息。我在帐户历史记录表中保留每个员工的运行历史记录,没有重叠的日期。我基本上是在尝试提示我的用户他们想要该员工的员工/帐户的日期。因此,我需要根据用户在运行时选择的日期选项来动态/有条件地加入。这是我正在使用的当前查询,它在第 3 行第 51 列上返回缺少表达式错误。我仍在挖掘,但我想我会在这里问,以防有人已经取得了类似的成就。
(用户将通过应用程序填充 :DATEOPTION 变量。任何其他变量都由应用程序自动填充)
SELECT EMP.employeeid, ACT.accountname FROM employee EMP LEFT OUTER JOIN accounthistory AHI ON (EMP.employeeid = AHI.employeeid AND CASE :DATEOPTION WHEN 1 THEN EMP.ppstartdatedtm BETWEEN AHI.effectivedtm AND AHI.expirationdtm WHEN 2 THEN EMP.ppenddatedtm BETWEEN AHI.effectivedtm AND AHI.expirationdtm WHEN 3 THEN EMP.cpstartdatedtm BETWEEN AHI.effectivedtm AND AHI.expirationdtm WHEN 4 THEN EMP.cpenddatedtm BETWEEN AHI.effectivedtm AND AHI.expirationdtm WHEN 5 THEN TO_DATE(:STARTDATETIME,'MM/DD/YYYY HH24:MI:SS') BETWEEN AHI.effectivedtm AND AHI.expirationdtm WHEN 6 THEN TO_DATE(:ENDDATETIME,'MM/DD/YYYY HH24:MI:SS') BETWEEN AHI.effectivedtm AND AHI.expirationdtm END) INNER JOIN account ACT ON (AHI.accountid = ACT.accountid
最佳答案
Oracle 不支持 case
表达式返回的“ bool ”类型。无论如何,都不需要 case
:
ON EMP.employeeid = AHI.employeeidCASE AND
( (:DATEOPTION = 1 AND EMP.ppstartdatedtm BETWEEN AHI.effectivedtm AND AHI.expirationdtm) OR
(:DATEOPTION = 2 AND EMP.ppenddatedtm BETWEEN AHI.effectivedtm AND AHI.expirationdtm) OR
. . .
)
关于sql - Oracle 条件连接语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48875884/