MySQL Ordina per numero, durata Nulls

Attualmente sto facendo un OrderBy molto semplice nella mia dichiarazione.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC 

Il problema con questo è che le voci NULL per “position” sono considerate come 0. Quindi tutte le voci con posizione NULL appaiono prima di quelle con 1,2,3,4. per esempio:

 NULL, NULL, NULL, 1, 2, 3, 4 

C’è un modo per ottenere il seguente ordine:

 1, 2, 3, 4, NULL, NULL, NULL. 

MySQL ha una syntax non documentata per ordinare i null. Inserisci un segno meno (-) prima del nome della colonna e imposta ASC in DESC:

 SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC 

È essenzialmente l’inverso della position DESC ponendo i valori NULL per ultimi ma in caso contrario è uguale alla position ASC .

Un buon riferimento è qui http://troels.arvin.dk/db/rdbms#select-order_by

Ho trovato che questa è una buona soluzione per la maggior parte:

 SELECT * FROM table ORDER BY ISNULL(field), field ASC; 

Qualcosa di simile a

 SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC 

Sostituire 999999999 con quello che mai è il valore massimo per il campo

Prova a utilizzare questa query:

 SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC 

Puoi coalizzare i tuoi NULL nell’istruzione ORDER BY :

 select * from tablename where  order by coalesce(position, 0) ASC, id DESC 

Se vuoi ordinare i NULL in fondo, prova a coalesce(position, 100000) . (Rendi il secondo numero più grande di tutte le altre position nel db.)

 SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC 

È ansible scambiare le istanze di NULL con un valore diverso per ordinarle per prime (come 0 o -1) o per ultime (un numero big o una lettera) …

 SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2 FROM tablename WHERE visible = 1 ORDER BY ordered_field2 ASC, id DESC 

Per una colonna DATE puoi usare:


Ultimo NULL:

 ORDER BY IFNULL(`myDate`, '9999-12-31') ASC 

Gli spazi vuoti durano:

 ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC 

NULL ULTIMO

 SELECT * FROM table_name ORDER BY id IS NULL, id ASC 

Perché non ordini da NULLS LAST?

 SELECT * FROM tablename WHERE visible = 1 ORDER BY position ASC NULLS LAST, id DESC