ORDINA PER DATA mostrando prima i NULL e poi le date più recenti
-
03-07-2019 - |
Domanda
Ho una procedura memorizzata che esegue un'istruzione select. Vorrei che i miei risultati fossero ordinati in base a un campo data e visualizzare prima tutti i record con le date NULL e poi le date più recenti.
La dichiarazione è simile alla seguente:
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC
Ora questo mostrerà prima tutti i record con Date di invio NULL, ma quando arrivo alle righe che contengono valori di data, non sono le date più recenti nella vista.
Se sostituisco ASC con DESC, ottengo le date nell'ordine desiderato, ma i valori NULL sono in fondo al mio set di risultati.
Esiste un modo per strutturare la mia query in modo che io possa visualizzare i valori null in alto e quindi quando ci sono valori di data, per ordinarli dal più recente al più vecchio?
Soluzione
@Chris, ce l'hai quasi.
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
[Modifica: #Eppz mi ha chiesto di modificare il codice sopra come attualmente mostrato]
Personalmente preferisco questo molto meglio della creazione di "numeri magici". I numeri magici sono quasi sempre un problema in attesa di accadere.
Altri suggerimenti
Puoi fare qualcosa del genere mettendo i NULL in fondo:
ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
Lo standard SQL (ISO / IEC 9075-2: 2003 o successivo - 2008) prevede:
ORDER BY SomeColumn NULLS FIRST
La maggior parte dei DBMS non lo supporta ancora, AFAIK.
try
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
OrderBy="ColumnName = NULL desc, ColumnName desc"
prova questo
SELEZIONA a, b, c, [Data invio] A PARTIRE DAL someView ORDINATO DA isnull ([Data presentazione], cast ('1770/01/01' come datetime)) ASC
So che è vecchio, ma quando l'ho trovato ho notato la soluzione accettata, https://stackoverflow.com/a/ 821856/7177892 , potrebbe essere semplificato facendo in modo che il risultato dell'istruzione CASE 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
semplificata:
ORDER BY (CASE WHEN [Submission Date] IS NULL
THEN GETDATE()
ELSE [Submission Date]
END) DESC