2013-10-04 8 views
6

Chcę porównać dwie daty z dwóch kolumn i uzyskać największy, a następnie porównać z wartością daty. Dwie kolumny mogą również posiadać wartości NULL.Na przykład chcę poniżej OUTPUT.Jak zrobić Używam największej funkcji lub jeśli jest coś jeszcze. Ponownie używam wyjścia, aby porównać z inną datą.Obsługa Null w Największe funkcje w Oracle

Col A   Col B   OUTPUT 
--------------------------------------- 
NULL   NULL   NULL 
09/21/2013 01/02/2012  09/21/2013 
NULL   01/03/2013  01/03/2013 
01/03/2013 NULL   01/03/2013 

Odpowiedz

3

Wykorzystanie Oracle CASE... WHEN structure w swoim select (niesprawdzone):

SELECT COLA, COLB, CASE 
    WHEN (COLA > COLB OR COLB IS NULL) 
    THEN COLA 
    WHEN (COLA < COLB OR COLA IS NULL) 
    THEN COLB 
    WHEN (COLA = COLB) 
    THEN COLA 
    ELSE NULL 
    END 
    AS OUTPUT 
FROM ... 
0

Coś

SELECT CASE WHEN ColA is NULL and ColB is NULL then NULL 
WHEN coalesce(ColA, '01/01/1753')>coalesce(ColB, '01/01/1753') then ColA 
ELSE ColB END as Output 
+0

który działa jeśli używasz 'TO_DATE()' wokół magicznych dat, najlepiej ze specyficznym model formatu daty; lub najlepiej (osobiście) przy użyciu notacji daty ANSI jako "date" 1753-01-01 ". –

+0

Dzięki tak, to działa –

5

Inna wersja użyciu a case expression obsłużyć wartości null:

select cola, colb, 
    case when cola is null and colb is null then null 
    when cola is null then colb 
    when colb is null then cola 
    else greatest(cola, colb) 
    end as output 
from <table>; 

COLA  COLB  OUTPUT 
---------- ---------- ---------- 

09/21/2013 01/02/2012 09/21/2013 
      01/03/2013 01/03/2013 
01/03/2013   01/03/2013 
+0

Bardzo dziękuję za tę pomoc, zaimplementuję to –

0

Próbowałem this..found po googlowania

WITH ABC AS (SELECT NULL AS col1 , NULL AS col2 FROM dual UNION 
SELECT NULL , DATE'2013-08-12' FROM dual UNION 
    SELECT DATE'2013-08-12' , NULL FROM dual UNION 
    SELECT DATE'2013-08-12', DATE'2013-09-12' FROM dual) 

    SELECT col1, col2 , substr(greatest('x'||col1,'x'||col2),2) 
     FROM ABC; 
+0

To robi niejawną konwersję twoich kolumn daty na ciągi, używając jakiegokolwiek bieżącego 'NLS_DATE_FORMAT', a następnie porównując ciągi, a nie daty. Ustawienie "MM/DD/RRRR" nie będzie działać, jeśli daty są w różnych latach; w twoim ostatnim wierszu zmień drugą datę na "2012-09-12" i nadal będzie to zgłosić jako "większy niż" 2013-08-12 ", ponieważ faktycznie porównuje' 09/12/2012'' i ' '08/12/2013'', a to prawda w przypadku porównania ciągów znaków ... –

+0

ohh Rozumiem, bardzo dziękuję za te informacje .. miałem zaimplementować to –

+0

@Alex: Jeszcze raz dziękuję, masz rację ... –

2

Jeśli masz wiele kolumn do porównania (więcej niż 2 lub 3), a następnie obsługa wszystkich różne kombinacje przypadku może dostać nieporęczny. Można spróbować (11g):

with x as (
    select 1 as id, sysdate - 30 as col1, sysdate-50 as col2, sysdate-20 as col3,null as col4, sysdate-1 as col5 from dual 
    union 
    select 2 as id, sysdate - 10 as col1, sysdate-20 as col2, null as col3,null as col4, sysdate-35 as col5 from dual 
    union 
    select 3 as id, null as col1, null as col2, null as col3, null as col4, null as col5 from dual 
) 
select id, max(dates) 
from x 
UNPIVOT INCLUDE NULLS 
(dates FOR colname IN (col1,col2,col3,col4,col5)) 
group by id 
7

Można spróbować wykonać następujące czynności:

SELECT cola, colb, COALESCE(GREATEST(cola, colb), cola, colb) AS output 
    FROM yourtable; 

Powodem jest to, że GREATEST()COALESCE() powraca NULL jeśli którykolwiek z parametrów jest NULL.

5

Twoje pytanie dotyczy w szczególności dwóch kolumn, ale natrafiłem na sytuacje, w których potrzebowałem GREATEST/LEAST więcej niż dwóch kolumn. W tych scenariuszach można użyć COALESCE i rozwinąć rozwiązanie do dowolnej liczby kolumn.

Oto przykład z trzema kolumnami a, b i c:

GREATEST(
    COALESCE(a, b, c), 
    COALESCE(b, c, a), 
    COALESCE(c, a, b) 
) 

Zauważ, że kolejność kolumna z COALESCE zmian tak, aby każda kolumna wejściowy jest pierwszym elementem COALESCE co najmniej raz. Jedynym momentem, który zwróci wartość NULL, jest sytuacja, gdy wszystkie kolumny wejściowe mają wartość NULL.

W „ogólnego rozwiązania” liczba COALESCE sprawozdania będzie równa liczbie kolumn wejściowych:

GREATEST(
    COALESCE(col1, col2, col3, col4, ....), 
    COALESCE(col2, col3, col4, ...., col1), 
    COALESCE(col3, col4, ...., col1, col2), 
    COALESCE(col4, ...., col1, col2, col3), 
    COALESCE(...., col1, col2, col3, col4), 
    ... 
)