2009-05-04 7 views
51

Ho una stored procedure che esegue un'istruzione select. Vorrei che i miei risultati fossero ordinati per un campo data e mostrassero tutti i record con date NULL prima e poi le date più recenti.ORDINA PER DATA che mostra NULLS prima delle date più recenti

La dichiarazione si presenta così:

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY [Submission Date] ASC 

Ora, questo visualizzerà tutti i record con NULL Submission Date prima, ma quando arrivo a righe che hanno valori di data a loro, non sono le più recenti date la vista.

Se sostituisco ASC con DESC, quindi ottengo le date nell'ordine desiderato, ma i valori NULL si trovano nella parte inferiore del mio set di risultati.

C'è un modo per strutturare la mia query in modo che possa visualizzare i valori nulli nella parte superiore e quindi quando ci sono valori di data, per ordinarli decrescente dal più recente al più vecchio?

risposta

85

@ Chris, è quasi avete.

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

[Edit: #Eppz mi ha chiesto di modificare il codice di cui sopra, come attualmente indicato]

Io personalmente preferisco questo molto meglio di quanto la creazione di "numeri magici". I numeri magici sono quasi sempre un problema in attesa di accadere.

+4

Perché preoccuparsi di DESC? Basta cambiare 0 e 1. –

+0

Chiaramente, ma stavo cercando di mantenere le mie modifiche il più vicino possibile al suggerimento di Chris. –

+0

In realtà non ho guardato i tag per vedere che era per sql2000. Il mio dovrebbe funzionare in MySQL. :) –

3

provare

SELECT a,b,c,[Submission Date] 
FROM someView 
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC 
+0

9999/99/99 con genera un errore in quanto non può essere analizzato a una data. – Eppz

+0

Vorrei usare questa soluzione al posto del caso. – Ionic

+0

Può essere facilmente utilizzato in LINQ – yoohoo

21

Si può fare qualcosa di simile ha messo il NULL di in basso:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC 
+0

+1 questa era l'unica risposta che ha funzionato in Access SQL per me. –

+1

Funzionava anche in SQLite. – IAmKale

+0

c'è qualche ragione per cui hai le parentesi quadre? – AndrewBramwell

0

provare questo

selezionare un, b, c, [data di presentazione ] DA someView ORDINA PER isnull ([Submissi sulla data], ghisa ('1770/01/01' come datetime)) ASC

+1

grazie per il cast ('2079/01/01' come datetime) parte ! – Sadegh

14

standard SQL (ISO/IEC 9075-2: 2003 o versione successiva - 2008) prevede:

ORDER BY SomeColumn NULLS FIRST 

La maggior parte dei DBMS in realtà non supportano questo ancora, per quanto ne so.

+1

Grazie per questo suggerimento, funziona con Oracle 11g. –

+2

Funziona anche con PostgreSQL 9.2.1. –

1
OrderBy="ColumnName = NULL desc, ColumnName desc" 
0

So che questo è vecchio, ma quando l'ho trovato ho notato la soluzione accettata, https://stackoverflow.com/a/821856/7177892, potrebbe essere semplificata, rendendo il risultato della dichiarazione CASE essere sia oggi (GETDATE()) o la data effettiva.

originale:

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
     [Submission Date] DESC 

semplificato:

ORDER BY (CASE WHEN [Submission Date] IS NULL 
       THEN GETDATE() 
       ELSE [Submission Date] 
      END) DESC 
+1

Questa semplificazione non funzionerà così com'è se si dispone di record con data odierna o date future. In tal caso, è possibile passare da GETDATE() a DATEADD() e aggiungere un numero oscenamente grande di giorni o anni alla data corrente. – nconantj