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
1 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ź.
Podobne pytania
Nowe pytania
sql
Structured Query Language (SQL) to język służący do wykonywania zapytań w bazach danych. Pytania powinny zawierać przykłady kodu, strukturę tabeli, przykładowe dane i znacznik używanej implementacji DBMS (np. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 itp.). Jeśli Twoje pytanie dotyczy wyłącznie konkretnego DBMS (używa określonych rozszerzeń / funkcji), użyj zamiast tego tagu tego DBMS. Odpowiedzi na pytania oznaczone tagiem SQL powinny używać standardu SQL ISO / IEC.
eff
idisc
?