Wie gebe ich zuerst Zeilen mit einem bestimmten Wert zurück?

124

Ich möchte, dass meine Abfrage zuerst die Zeilen der Tabelle zurückgibt, in denen eine Spalte einen bestimmten Wert enthält, und dann den Rest der Zeilen alphabetisch zurückgibt.

Wenn ich eine Tabelle wie dieses habe:

 - 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

Und mit dieser Tabelle möchte ich bei meiner Abfrage die Zeilen zurückgeben, die zuerst New York und dann den Rest der Zeilen nach Stadt alphabetisch sortieren. Ist dies mit nur einer Abfrage möglich?

Phoexo
quelle
Erwägen Sie, die akzeptierte Antwort in die zweite zu ändern, wenn Sie können, da die erste nur für MySQL und nicht für MSSQL funktioniert.
Magisch
Getan. Meine ursprüngliche Frage betraf MySQL, aber die Tags spiegelten dies sowieso nicht wider.
Phoexo
Danke dir. Ich bin heute Morgen auf etwas gestoßen, um etwas Ähnliches für ein Problem zu tun, das ich hatte. :)
Magisch

Antworten:

195

Auf SQL Server, Oracle, DB2 und vielen anderen Datenbanksystemen können Sie Folgendes verwenden:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Rob Farley
quelle
1
Vielen Dank! Hat mir in MsSQL geholfen
Rexxo
Das funktioniert tatsächlich in jeder SQL-Datenbank (und ist meiner Meinung nach eine viel sauberere Lösung als die akzeptierte Antwort)
a_horse_with_no_name
2
Funktioniert für mich in Oracle.
MonkeyWithDarts
1
Und für das, was ich brauchte, um 'New York' (oder einen anderen Wert) zuletzt zu platzieren, tauschen Sie einfach die 1 und 2 aus ... ORDER BY CASE WHEN city = 'New York' DANN 2 ELSE 1 END, city
deebs
4
Der ELSE 2Abschnitt bedeutet, dass New York zwar den Wert 1 erhält, alle anderen Werte jedoch den Wert 2. ... zumindest was die Sortierreihenfolge betrifft.
Rob Farley
106

Wenn Ihr SQL-Dialekt intelligent genug ist, um boolesche Ausdrücke als numerisch zu behandeln, können Sie Folgendes verwenden:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
Chaos
quelle
1
@MehrdadAfshari: Nein, MSSQL ist zu dumm, um Äquivalenztests in der ORDER BYKlausel zu verarbeiten.
Chaos
@a_horse_with_no_name: Haben Sie versucht, die obige Abfrage für MSSQL auszuführen?
Chaos
11
@chaos: Die obige Anweisung läuft zwar nicht mit SQL Server, aber das liegt daran, dass die Syntax nicht dem Standard entspricht und nur für MySQL funktioniert. Bei Verwendung einer CASEAnweisung (bei der es sich um Standard-SQL handelt) kann SQL Server sehr gut einen Ausdruck in der ORDER BYKlausel verwenden. " zu dumm, um Äquivalenztests durchzuführen " ist einfach falsch. Wenn überhaupt, sollte es lauten: " Unterstützt nicht MySQLs implizites Casting von Boolean trueauf den Wert 1(eins). "
a_horse_with_no_name
@ Esraa_92: Dann haben Sie keinen SQL-Dialekt, der damit umgehen kann, und Sie brauchen Rob Farleys Antwort.
Chaos
5
Für Postgres funktionierte dies für mich:ORDER BY id = 123 DESC, name ASC
user1032752
4

Meine Antwort ist möglicherweise alt und nicht erforderlich, aber jemand benötigt möglicherweise einen anderen Ansatz und veröffentlicht sie daher hier.

Ich hatte die gleiche Anforderung implementiert, arbeitete für mich.

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

PS

Dies ist für SQL

Manjuboyz
quelle