2010-02-07 10 views
6

Estoy tratando de obtener una lista ordenada de filas de mi tabla de base de datos MYSQL basada en un valor entero 'lugar'.Reordenar entero excepto el valor 0 con sql

SELECT * FROM mytable 
ORDER BY place; 

Esto funciona bien, excepto que todas las filas con el valor place = 0 deben aparecer al final de la tabla.

Así que si mi mesa es:

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

debe convertirse en:

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

Respuesta

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

es una solución sin CASE

+0

Me gusta esta solución ya que es pequeña y se ve bien. A menos que sea menos eficiente, lo acepto. – Roalt

+0

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

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

de esa manera a obtener todos los ceros no ordenadas en primer lugar.

+0

Nunca había visto la construcción CASO antes (pero entonces, llegó a mis clases de SQL en la temprana noventas). Debido a la sencillez, prefiero el @True Soft. – Roalt

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

Este enfoque implica que sabemos que 9999 (o algún otro valor) es mayor que todos los valores posibles en la columna de lugar.

Como alternativa podemos clasificar por dos valores como en:

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

Gracias, los trucos 9999 fue algo en lo que pensé, simplemente no sabía que podía cambiar los criterios de ordenamiento evaluados de orden. Si una lista de pedidos duplicados tendría una penalización de alto rendimiento, esta sería mi primera opción siguiente. – Roalt

Cuestiones relacionadas