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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top