Jestem nowy w serwisie i SQL. Potrzebuję pomocy z wyrażeniem przypadku.

Wymóg jest następujący:

Mam tabelę T1 z dwiema kolumnami daty - eff i disc;

Druga tabela T2 z 2 kolumnami daty - data_data i data_off_data;

Próbuję zbudować jedno wyrażenie przypadku, w którym mogę porównać kolumny daty przy obu tabelach i przypisać wartości w oparciu o określone warunki.

Warunki to:

• Jeśli daty T1.eff i T2.disc są ustawione na domyślne, tj. T1.eff=1/1/1970 i T2.disc=1970

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

• Jeśli T1.wyp >T2.w_data i T1.dysk >T2.off_data

 Then set T1.disc=T2.Off_date.

• Jeżeli T1.eff

 Then set T1.eff=T2.On_date.

• Jeżeli T1.eff T2.off_date

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

• Jeśli T1.wyw >T2.w_data i T1.dysk

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

Zacząłem pisać wyrażenie Case i utknąłem na tym, jak zbudować / napisać blok; gdzie muszę porównać zarówno daty „eff” i „disc” jako jeden warunek, a następnie przypisać odpowiednią wartość do obu „eff” i „disc” w pojedynczym wyrażeniu przypadku.

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 

ITP.

Nie jestem pewien, czy możemy uzyskać/użyć dwóch kolumn w jednym wyrażeniu przypadku.

Oracle DB — wersja klienta: 12.1.0.2.0

Z góry dziękuję! => VPPG

0
VPPG 27 listopad 2018, 17:13
Jakie są Twoje oczekiwane wyniki z tej instrukcji SELECT? Nie możesz przypisywać wartości do kolumn w SELECT. Czy chcesz ZAKTUALIZOWAĆ wartości w tabeli, czy po prostu wyświetlić zmodyfikowane wartości eff i disc?
 – 
kfinity
27 listopad 2018, 17:44
Cześć Kfinity, Dziękuję za odpowiedź. Tak, chciałbym pobrać zaktualizowane/przypisane wartości i wstawić je do tabeli (t3) w późniejszym czasie.
 – 
VPPG
27 listopad 2018, 17:59

1 odpowiedź

Najlepsza odpowiedź

Myślę, że chcesz zmodyfikować wartości EFF i DISC, które są wyświetlane w danych wyjściowych SELECT. Nie możesz tego łatwo zrobić za pomocą pojedynczej instrukcji case, ponieważ chcesz zmienić dane wyjściowe 2 kolumn. Ale jeśli uprościsz swoją logikę, nadal możesz zachować prostotę.

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;

Zauważ też, że używam innej formy wyrażenia CASE - są dwa sposoby na jej użycie.

Jeśli to naprawdę nie rozwiąże Twojego problemu, daj mi znać, a zaktualizuję moją odpowiedź.

0
kfinity 27 listopad 2018, 18:17
Dziękuję, Kfinity. Uruchomię ten kod i zweryfikuję wyniki, a jutro zaktualizuję. Dzięki jeszcze raz!
 – 
VPPG
27 listopad 2018, 19:05
Powyższy kod działa dla mnie. Dziękuję Ci. Teraz zostałem poproszony o dołączenie logiki odrzucenia dla walidacji tej samej daty. Poniżej przedstawiam logikę odrzucenia: Odrzuć wszelkie rekordy, jeśli T1.eff < T2. On_date i T1.disc < T2.On_date | • Odrzuć wszelkie rekordy, jeśli T1.eff > T2. Off_date i T1.disc > T2.Off_date • Wszystkie odrzucone wiersze są wstawiane do tabeli Reject_exception (nowej, do utworzenia).
 – 
VPPG
28 listopad 2018, 13:10