Сравнение и назначение условных дат с использованием выражения Case в Oracle SQL - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок на сайте и SQL.Мне нужна помощь с выражением регистра.

Требование следующее:

У меня есть таблица T1 с двумя столбцами даты - eff и disc;

Вторая таблицаT2 с двумя столбцами даты - 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 

ETC.

Я не уверен, сможем ли мы получить / использовать два столбца в одном выражении.

Oracle DB - версия клиента: 12.1.0.2.0

Заранее спасибо!=> VPPG

1 Ответ

0 голосов
/ 27 ноября 2018

Я думаю, что вам нужно изменить значения для EFF и DISC, которые отображаются на выходе SELECT.Вы не можете легко сделать это с помощью одного оператора 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 - его можно использовать двумя способами.

Если это не решит вашу проблему, дайте мне знать, и я обновлю свой ответ.

...