2012-03-12 15 views
9

Ho una tabella con tre colonne; la prima colonna contiene gli ID e le altre due colonne contengono le date (dove al massimo uno è nullo, ma non credo che questo dovrebbe influenzare nulla). Come dovrei fare per ordinare gli ID in base a quale data è più grande? Ho provatoOrdine SQL da due diverse colonne (eventualmente null)

ORDER BY CASE 
WHEN date1 > date2 THEN date1 
ELSE date2 
END 

ma questo non ha funzionato. Qualcuno può aiutarmi? Inoltre, tutti i problemi simili che ho visto altri post lo hanno fatto in modo che la query ordina i risultati in base alla prima colonna, e quindi se la prima colonna è nullo, la seconda colonna. Dovrei prima definire ogni singolo valore null? Sto creando questo tavolo con un join esterno completo, quindi sarebbe una domanda completamente diversa da chiedere, quindi si spera che possa essere fatto con valori null.

+1

L'espressione 'CASE' mi sembra soddisfacente, tranne nel fatto che non supporta il caso in cui' date2' è nullo; per supportare anche questo, si vorrebbe scrivere (dire) 'ORDER BY CASE WHEN date1> date2 OR date2 IS NULL THEN date1 ELSE date END'. Ma tu dici che "non ha funzionato". Può essere più preciso? Ad esempio, puoi pubblicare dati reali che non vengono ordinati correttamente? – ruakh

+0

Gabe, quale database eseguirà la query? –

+0

Mi dispiace, pensavo che funzionassero tutti allo stesso modo. Ma sto usando Oracle. Non so se è abbastanza specifico per voi ragazzi. : S –

risposta

15

Credo che il problema è legato alla mancanza di confronto quando uno colonna è NULL. Quindi, probabilmente, è necessario:

ORDER BY CASE 
      WHEN date1 IS NULL THEN date2 
      WHEN date2 IS NULL THEN date1 
      WHEN date1 > date2 THEN date1 
      ELSE     date2 
      END 
+0

Questo ha funzionato, grazie! : D –

-1

Try ...

SELECT MAX(date1,date2) date FROM table ORDER BY date; 
+0

Sì, ma non è possibile farlo in SQL standard senza in qualche modo unire la tabella su se stesso su date1! = Null, quindi collegarsi nuovamente su date2! = Null, ma fornire sia lo stesso ALIAS che ha un comportamento non definito. – DanRedux

+0

(Ho cancellato i miei commenti precedenti, per sostituirli con uno più chiaro.) Non penso che nessun DBMS supporti quell'uso di 'MAX'; forse stai pensando a "PIÙ GRANDE"? Ma comunque, non c'è davvero bisogno di questo approccio; queste espressioni possono andare bene nella clausola 'ORDER BY'. – ruakh

+0

Potrebbero, ma l'aliasing in quanto la propria colonna consente di recuperare anche la data. Funzionalità extra e gratuita. – DanRedux