¿Cómo devuelvo las filas con un valor específico primero?

124

Quiero que mi consulta devuelva las filas de la tabla donde una columna contiene un valor específico primero, y luego devuelve el resto de las filas ordenadas alfabéticamente.

Si tengo una tabla algo como este ejemplo:

 - Table: Users
 - id - name -  city
 - 1    George  Seattle
 - 2    Sam     Miami
 - 3    John    New York
 - 4    Amy     New York
 - 5    Eric    Chicago
 - 6    Nick    New York

Y usando esa tabla, quiero que mi consulta devuelva las filas que contienen Nueva York primero, y luego el resto de las filas ordenadas alfabéticamente por ciudad. ¿Es posible hacerlo usando solo una consulta?

Phoexo
fuente
Considere cambiar la respuesta aceptada a la segunda si puede, ya que la primera solo funciona para MySQL y no para MSSQL.
Magisch
Hecho. Mi pregunta original era sobre MySQL, pero las etiquetas no reflejan eso de todos modos.
Phoexo
Gracias. Encontré esto esta mañana en un esfuerzo por hacer algo similar por un problema que tenía. :)
Magisch

Respuestas:

195

En SQL Server, Oracle, DB2 y muchos otros sistemas de bases de datos, esto es lo que puede usar:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Rob Farley
fuente
1
¡Gracias! Me ayudó en MsSQL
Rexxo
Eso realmente funciona en cualquier base de datos SQL (y es una solución mucho más limpia que la respuesta aceptada en mi opinión)
a_horse_with_no_name
2
Funciona para mí en Oracle.
MonkeyWithDarts
1
Y para lo que necesitaba para colocar 'Nueva York' (u otro valor) al final, simplemente cambie el 1 y 2 ... ORDEN POR CASO CUANDO city = 'New York' LUEGO 2 ELSE 1 END, city
deebs
44
La ELSE 2sección significa que mientras Nueva York obtiene el valor 1, todos los demás valores obtienen el valor 2. ... al menos en lo que respecta al orden de clasificación.
Rob Farley
106

Si su dialecto SQL es lo suficientemente inteligente como para tratar las expresiones booleanas como si tuvieran un valor numérico, entonces puede usar:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
caos
fuente
1
@MehrdadAfshari: No, MSSQL es demasiado estúpido para procesar pruebas de equivalencia en la ORDER BYcláusula.
caos
@a_horse_with_no_name: ¿Has intentado ejecutar la consulta anterior en MSSQL?
caos
11
@chaos: la declaración anterior de hecho no se ejecuta con SQL Server, pero eso se debe a que la sintaxis no es estándar y solo funciona para MySQL. Cuando se usa una CASEdeclaración (que es SQL estándar), SQL Server puede usar una expresión en la ORDER BYcláusula. " demasiado estúpido para procesar pruebas de equivalencia " es simplemente incorrecto. Si es que debería leer: " no es compatible con la conversión implícita de booleano de MySQL trueal valor 1(uno) "
a_horse_with_no_name
@ Esraa_92: Entonces no tienes un dialecto SQL que pueda manejarlo y necesitas la respuesta de Rob Farley.
caos
55
Para Postgres, esto funcionó para mí:ORDER BY id = 123 DESC, name ASC
user1032752
4

Mi respuesta puede ser antigua y no requerida, pero alguien puede necesitar un enfoque diferente, por lo tanto, publicarlo aquí.

Tenía el mismo requisito implementado esto, funcionó para mí.

Select * from Users
ORDER BY
(CASE WHEN city = 'New York' THEN 0 ELSE 1 END), city
GO

PD

esto es para SQL

Manjuboyz
fuente