2013-10-04 18 views
6

Desidero confrontare due date da due colonne e ottenere il massimo e quindi confrontarlo con un valore di data. Le due colonne possono contenere anche i valori NULL. Ad esempio, desidero il seguente OUTPUT. Come fare Io uso la funzione più grande o se c'è qualcos'altro. Sto ancora usando l'output per confrontarlo con un'altra data.Gestione di null nella più grande funzione in 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 

risposta

3

Usa Oracle CASE... WHEN structure nel select (non testata):

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

Qualcosa di simile

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

che funziona se si utilizza 'to_date()' attorno alle date magiche, idealmente con una specifica modello di formato data; o preferibilmente (personalmente) usando la notazione data ANSI come "data" 1753-01-01 ". –

+0

Grazie sì funziona –

5

Un'altra versione utilizzando a case expression per gestire le null valori:

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

Grazie mille questo aiuto, implementerò questo –

0

Ho provato this..found dopo googling

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

Questo sta facendo una conversione implicita delle tue colonne di data alle stringhe, usando qualunque sia il tuo attuale 'NLS_DATE_FORMAT', e poi confrontando le stringhe, non le date. Con l'impostazione 'MM/DD/YYYY', non funzionerà se le date sono in anni diversi; nella tua ultima riga cambia la seconda data a '2012-09-12' e lo segnalerà come 'maggiore di' '2013-08-12' - perché in realtà sta comparando' '09/12/2012'' e ' '08/12/2013'', e questo è vero per un paragone delle stringhe ... –

+0

ohh Capisco, grazie mille per questa informazione ... stavo per implementare questo –

+0

@Alex: Grazie ancora hai ragione .. –

2

Se si dispone di molte colonne da confrontare (più di 2 o 3), quindi gestire tutte le varie combinazioni CASE potrebbe ottenere ingombrante. Si potrebbe provare (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

si potrebbe provare la seguente:

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

La ragione è che COALESCE()GREATEST() restituisce NULL se uno dei parametri è NULL.

5

La tua domanda riguarda in particolare due colonne, ma ho incontrato situazioni in cui avevo bisogno di GREATEST/LEAST di più di due colonne. In questi scenari è possibile utilizzare COALESCE ed espandere la soluzione su tutte le colonne desiderate.

Ecco un esempio con tre colonne a, b e c:

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

noti che l'ordinamento colonna delle COALESCE modifiche in modo che ogni colonna di input è il primo elemento COALESCE almeno una volta. L'unica volta che restituisce NULL è quando tutte le colonne di input sono NULL.

Nella "soluzione generale" il numero di COALESCE dichiarazioni sarà uguale al numero di colonne di input:

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), 
    ... 
)