0

我是该站点和 SQL 的新手。我需要一些关于案例表达的帮助。

要求如下:

我有一个表 T1 有两个日期列 - eff 和 disc;

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

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

条件是:

• 如果 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 表达式,我被困在如何构建/编写块上;我需要将“eff”和“disc”日期作为一个条件进行比较,然后在单个案例表达式中将各自的值分配给“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 

等等。

我不确定我们是否可以在单个案例表达式中获取/使用两列。

Oracle DB - 客户端版本:12.1.0.2.0

提前致谢!=> VPPG

4

1 回答 1

0

我认为您想要的是修改SELECT 输出中显示的EFF和的值。DISC您不能使用单个 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表达式 - 有两种使用方法。

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

于 2018-11-27T15:17:03.933 回答