2009-09-21 11 views
43

Così Oracle ha NULLS FIRST, che posso usare per avere valori nulli ordinati in alto seguita da mio valore colonna in ordine decrescente:SQL Server equivalente a NULLS FIRST di Oracle?

ORDER BY date_sent NULLS FIRST 

Ciò che è paragonabile in SQL Server? Ci sono queste alternative, assumendo i valori di data sono NULL o nel passato:

ORDER BY ISNULL(date_sent, GETDATE()) DESC 
ORDER BY (CASE WHEN t.setinactive IS NULL THEN 1 ELSE 2 END), t.setinactive DESC 
ORDER BY -CAST(date_sent as int) ASC 

Altro?

+2

Possibile duplicato di http://stackoverflow.com/questions/821798/order-by-date-showing-nulls-first-then-most-recent-dates –

risposta

59

Si può fare qualche trucco:

ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 
+2

Con questo trucco è possibile ottenere qualsiasi ordine desiderato. Puoi anche imitare l'interfaccia IComparer più generale trovata in molte lingue. – usr

1

Non è possibile controllare questo, per quanto ne so. E sembra che tu abbia l'approccio corretto con ISNULL.

Con stringhe, ho utilizzato ISNULL(field, '') per lo stesso scopo.

+0

Il problema con questo è come ha detto GMastros ... – Kev

+1

Kev: Tutto dipende dalla natura del problema in questione. La domanda non era "è questa la clausola ORDER BY da usare in tutti i casi?" E quindi il punto di G Mastros è ben noto ma non strettamente sul percorso critico della domanda stessa. rexem sta cercando un modo più globale di controllare l'ordinamento NULL. –

5

Use Case/Quando dichiarazione, ad esempio:

ORDER BY (case WHEN ColINT IS NULL THEN {maxIntValue} ELSE ColINT END) DESC 

ORDER BY (case WHEN ColVChar IS NULL THEN {maxVCharValue} ELSE ColVChar END) DESC 

ORDER BY (case WHEN ColDateT IS NULL THEN {maxDateTValue} ELSE ColDateT END) DESC 

... e così via.

o anche meglio come non ti interessa che tipo di colonna è il valore massimo.

ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC 
4

Se avete le righe della tabella con date meno di adesso, e altri file con date superiore a ora, i tuoi NULLS apparirebbe nel mezzo di la lista. Invece, dovresti probabilmente usare un valore che non verrà mai ordinato nel bel mezzo della tua lista.

Ordina per IsNull (Date_Sent, '17.530.101') disc

Nota: Questa data è in realtà 1 gen 1753.

+0

L'ordine di IsNull (Date_Sent, '17530101') desc garantisce che le mie colonne con un valore data_sent null appaia in basso, non in alto. Hai ragione, ma non viaggio nel futuro per impostare il valore date_sent =) –

+0

Un buon punto, ma il principio rimane valido. Dovresti usare un valore che non si verificherà naturalmente nei tuoi dati. Es: ordine di IsNull (Date_Sent, '99990101') desc –

+0

Completamente d'accordo sull'uso di un valore sentinella. –

3
ORDER BY 
    COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000') 
,OTHER_FIELDS 
+0

Non funziona: i valori nulli sono i primi, ma il resto delle colonne date_sent non sono ordinati in ordine DESC. –

3

Questo è un modo alternativo quando si desidera regolare l'aspetto dei valori nulli nell'ordinamento. Annulla la colonna e inverti il ​​tuo ordine. Sfortunatamente avresti bisogno di colonne CAST dateTime.

ORDER BY -CAST(date_sent as int) ASC 
+0

Confermato: i valori Null sono nella parte superiore e i valori non nulli sono nell'ordine DESC. –

4

Un semplice esempio:

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3 
FROM TableName 
ORDER BY ValueIsNull DESC, Value1 
11

La risposta più immediata è questa: la soluzione migliore per cambiare l'ordinamento dei valori nulli nei casi necessari è quella accettata.Ma basta usarlo, o una variante di esso nei casi necessari:

  • DISC + NULLS FIRST:

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

  • ASC + NULLS LAST:

    ORDER BY (CASE WHEN [Order] IS NULL THEN 1 ELSE 0 END), [Order] ASC

  • ASC + NULLS PRIMA: funziona di default

  • DESC + NULLS ULTIME: funziona benissimo per default

Vediamo perché:

Se si seleziona la ORDER BY Clause (Transact-SQL) MSDN docs, e scorrere verso il basso per ASC | DESC, potete leggere questo:

ASC | DESC

Specifica che i valori nella colonna specificata devono essere ordinati in ordine crescente o decrescente. ASC ordina dal valore più basso al valore più alto. DESC ordina dal valore più alto al valore più basso. ASC è l'ordinamento predefinito. I valori nulli vengono considerati come i valori più bassi possibili.

Quindi, per impostazione predefinita se si specifica l'ordine ASC, funziona come NULLS FIRST. E, se si specifica DESC, funziona come NULLS LAST.

modo che solo bisogno di fare modificare il comportamento per NULLS FIRST in DESC ordine, e per NULLS LAST in ASC ordine.

IMHO, la soluzione migliore per modificare l'ordinamento di null nei casi necessari è accettata, ma l'ho inclusa adattandola ai diversi casi all'inizio della mia risposta.

Problemi correlati