sql - Oracle 条件连接语句

标签 sql oracle join

我正在编写一个查询来提取员工和帐户信息。我在帐户历史记录表中保留每个员工的运行历史记录,没有重叠的日期。我基本上是在尝试提示我的用户他们想要该员工的员工/帐户的日期。因此,我需要根据用户在运行时选择的日期选项来动态/有条件地加入。这是我正在使用的当前查询,它在第 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/

相关文章:

非规范化数据的 SQL 函数约束

sql - 是否可以在 Oracle 中创建一个不作为主键的标识列,它与 H2 数据库有何关系?

sql - Oracle SQL 对值求和,直到达到另一个值

mysql - Join多个表显示3个或更多表的数据

mysql - 连接 MySQL 查询中两个或多个列的列输出

mysql - 使用 JOIN ON 和 JOIN ON WHERE 的不同行为

java - 从字符串到 Clob 以及 Clob 到字符串的转换

mysql - 每天计算和总结不同的值

sql - 更新 SQL 中保留旧值的行

c++ - 与 CLOB 兼容的 Pro-C 缓冲区类型