2010-02-07 14 views
6

Sto cercando di ottenere un elenco ordinato di righe dalla mia tabella di database MySQL basata su un valore intero 'luogo'.Riordina numero intero ad eccezione del valore 0 con sql

SELECT * FROM mytable 
ORDER BY place; 

Questo funziona correttamente, tranne che tutte le righe con valore posto = 0 devono essere visualizzate alla fine della tabella.

Quindi, se il mio tavolo è:

name place 
---- ----- 
John 1 
Do 2 
Eric 0 
Pete 2 

dovrebbe diventare:

name place 
---- ----- 
John 1 
Do 2 
Pete 2 
Eric 0 

risposta

4
SELECT * 
FROM myTable 
ORDER BY place>0 DESC, place 

è una soluzione senza CASE

+0

Mi piace questa soluzione perché è piccola e sembra a posto. A meno che non sia meno efficiente, tengo questo accettato. – Roalt

+0

o semplicemente 'ORDER BY place = 0, place' – ysth

6
order by case when place = 0 then 1 else 0 end asc, place asc 

in questo modo si ottengono tutti i non-zeri ordinato prima.

+0

Mai visto la costruzione caso prima (ma poi, ho avuto le mie classi di SQL nei primi anni anni novanta). A causa della semplicità, preferisco il metodo @True Soft. – Roalt

2
SELECT * 
FROM myTable 
ORDER BY CASE place WHEN 0 THEN 9999 ELSE place END 

Questo approccio implica che abbiamo saputo che 9999 (o qualche altro valore) è più grande di tutti i possibili valori nella colonna del luogo.

In alternativa possiamo ordinare da due valori come in:

ORDER BY CASE place WHEN 0 THEN 0 ELSE -1 END, place 
+0

Grazie, i trucchi 9999 erano qualcosa che pensavo di me stesso, ma non sapevo che potevi cambiare i criteri di ordinamento valutati dell'ordine. Se un elenco di ordini duplicato avrebbe una penalità ad alte prestazioni, questa sarebbe la mia prima scelta successiva. – Roalt

Problemi correlati