Comment renvoyer d'abord des lignes avec une valeur spécifique?

124

Je veux que ma requête renvoie les lignes de la table où une colonne contient d'abord une valeur spécifique, puis renvoie le reste des lignes par ordre alphabétique.

Si j'ai une table quelque chose comme cet exemple:

 - 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

Et en utilisant cette table, je veux que ma requête renvoie les lignes qui contiennent d'abord New York, puis le reste des lignes alphabétisées par ville. Est-ce possible de faire en utilisant une seule requête?

Phoexo
la source
Pensez à changer la réponse acceptée par la deuxième si vous le pouvez, car la première ne fonctionne que pour MySQL et non pour MSSQL.
Magisch
Terminé. Ma question initiale portait sur MySQL, mais les balises ne reflétaient pas cela de toute façon.
Phoexo
Je vous remercie. Je suis tombé sur ceci ce matin dans le but de faire quelque chose de similaire pour un problème que j'avais. :)
Magisch

Réponses:

195

Sur SQL Server, Oracle, DB2 et de nombreux autres systèmes de base de données, voici ce que vous pouvez utiliser:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Rob Farley
la source
1
Merci! M'a aidé dans MsSQL
Rexxo
Cela fonctionne réellement dans n'importe quelle base de données SQL (et est une solution beaucoup plus propre que la réponse acceptée à mon avis)
a_horse_with_no_name
2
Fonctionne pour moi dans Oracle.
MonkeyWithDarts
1
Et pour ce dont j'avais besoin pour placer `` New York '' (ou une autre valeur) en dernier, échangez simplement le 1 et le 2 ... ORDER BY CASE WHEN city = 'New York' THEN 2 ELSE 1 END, city
deebs
4
La ELSE 2section signifie que si New York obtient la valeur 1, toutes les autres valeurs obtiennent la valeur 2. ... au moins en ce qui concerne l'ordre de tri.
Rob Farley
106

Si votre dialecte SQL est suffisamment intelligent pour traiter les expressions booléennes comme ayant une valeur numérique, vous pouvez utiliser:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
le chaos
la source
1
@MehrdadAfshari: Non, MSSQL est trop stupide pour traiter les tests d'équivalence dans la ORDER BYclause.
chaos du
@a_horse_with_no_name: Avez-vous essayé d'exécuter la requête ci-dessus sur MSSQL?
chaos
11
@chaos: l'instruction ci-dessus ne fonctionne en effet pas avec SQL Server, mais c'est parce que la syntaxe n'est pas standard et ne fonctionne que pour MySQL. Lors de l'utilisation d'une CASEinstruction (qui est SQL standard), SQL Server peut très bien utiliser une expression dans la ORDER BYclause. " trop stupide pour traiter les tests d'équivalence " est tout simplement faux. Si pas du tout, il devrait lire: " ne prend pas en charge le cast implicite de MySQL de booléen trueà la valeur 1(un). "
a_horse_with_no_name
@ Esraa_92: Alors vous n'avez pas de dialecte SQL qui peut le gérer et vous avez besoin de la réponse de Rob Farley.
chaos
5
Pour Postgres, cela a fonctionné pour moi:ORDER BY id = 123 DESC, name ASC
user1032752
4

Ma réponse est peut-être ancienne et non obligatoire, mais quelqu'un peut avoir besoin d'une approche différente, donc l'afficher ici.

J'ai eu la même exigence mise en œuvre cela, a travaillé pour moi.

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

PS

c'est pour SQL

Manjuboyz
la source