在 Oracle 中使用 Case 表达式进行条件日期比较和赋值 SQL

Conditional Date Comparison and Assignment using Case expression in Oracle SQL

我是该网站的新手 SQL。我需要 case 表达式方面的帮助。

要求如下:

我有一个带有两个日期列的 table T1 - eff 和 disc;

第二个 table T2 有 2 个日期列 - on_date & off_date;

我正在尝试构建一个单一的 case 表达式,我可以在其中比较 table 的日期列,并根据特定条件分配值。

条件是:

• 如果 T1.eff 和 T2.disc 日期设置为默认日期,即 T1.eff=1/1/1970 和 T2.disc=1970

  Then set set T1.eff=T2.on_date and T2.disc=T2.off_date

• 如果 T1.eff >T2.on_date 且 T1.disc >T2.off_date

 Then set T1.disc=T2.Off_date.

• 如果T1.eff

 Then set T1.eff=T2.On_date.

• 如果T1.eff T2.off_date

 Then set T1.eff=T2.On_date and T1.disc=T2.Off_date

• 如果 T1.eff >T2.on_date 且 T1.disc

  Then do not update eff, disc dates, insert as is.

我开始写一个 Case 表达式,但我对如何 build/write 块感到困惑;我需要将 'eff' 和 'disc' 日期作为一个条件进行比较,然后在单个 case 表达式中将各自的值分配给 'eff' 和 'disc'。

SELECT

CASE T1.EFF, T1.DISC

WHEN T1.EFF = TO_DATE('01/01/1970', 'MM/DD/YYYY') AND DISC = TO_DATE('01/01/1970', 'MM/DD/YYYY')

THEN T1.EFF = T2.ON_DATE AND T1.DISC = T2.OFF_DATE

WHEN T1.EFF > T2.ON_DATE AND T1.DISC > T2.OFF_DATE

THEN T1.EFF = T1.EFF AND T1.DISC = T2.OFF_DATE

WHEN T1.EFF < T2.OFF_DATE AND T1.DISC > T2.OFF_DATE

THEN T1.EFF = T2.ON_DATE AND T1.DISC = T2.OFF_DATE

WHEN T1.EFF > T2.ON_DATE AND T1.DISC < T2.OFF_DATE

THEN T1.EFF = T1.EFF AND T1.DISC - T1.DISC

END, 

T2.ON_DATE, T2.OFF_DATE

FROM T2, T1

WHERE T1.A = T2.B 

等等

我不确定我们是否可以 get/use 在单个 case 表达式中包含两列。

Oracle DB - 客户端版本:12.1.0.2.0

提前致谢! => VPPG

我想您想要的是修改 SELECT 输出中显示的 EFFDISC 的值。您不能使用单个 case 语句轻松地做到这一点,因为您想要更改 2 列的输出。但是如果你简化你的逻辑,你仍然可以保持它非常简单。

SELECT
    CASE WHEN T1.EFF = TO_DATE('01/01/1970', 'MM/DD/YYYY') AND DISC = TO_DATE('01/01/1970', 'MM/DD/YYYY')
        THEN T2.ON_DATE
        WHEN T1.EFF < T2.OFF_DATE AND T1.DISC > T2.OFF_DATE
        THEN T2.ON_DATE
        ELSE T1.EFF
    END as EFF, 
    CASE WHEN T1.EFF > T2.ON_DATE AND T1.DISC < T2.OFF_DATE
        THEN T1.DISC
        ELSE T2.OFF_DATE
    END as DISC,
    T2.ON_DATE, T2.OFF_DATE
FROM T2, T1
WHERE T1.A = T2.B;

另请注意,我使用的是 CASE 表达式的不同形式 - 有两种使用方法。

如果这不能真正解决您的问题,请告诉我,我会更新我的答案。