Jak najpierw zwrócić wiersze z określoną wartością?

124

Chcę, aby moje zapytanie zwróciło wiersze tabeli, w których kolumna zawiera najpierw określoną wartość, a następnie zwróciło pozostałe wiersze w kolejności alfabetycznej.

Jeśli mam tabelę coś takiego jak ten przykład:

 - 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

Korzystając z tej tabeli, chcę, aby moje zapytanie zwróciło wiersze zawierające najpierw Nowy Jork, a następnie pozostałe wiersze ułożone alfabetycznie według miasta. Czy można to zrobić za pomocą tylko jednego zapytania?

Phoexo
źródło
Jeśli możesz, rozważ zmianę zaakceptowanej odpowiedzi na drugą, ponieważ pierwsza działa tylko dla MySQL, a nie dla MSSQL.
Magisch
Gotowe. Moje pierwotne pytanie dotyczyło MySQL, ale tagi i tak tego nie odzwierciedlały.
Phoexo
Dziękuję Ci. Natknąłem się na to dziś rano, próbując zrobić coś podobnego dla problemu, który miałem. :)
Magisch

Odpowiedzi:

195

W SQL Server, Oracle, DB2 i wielu innych systemach baz danych można użyć:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Rob Farley
źródło
1
Dzięki! Pomógł mi w MsSQL
Rexxo
To faktycznie działa w każdej bazie danych SQL (i jest znacznie czystszym rozwiązaniem niż akceptowana odpowiedź w mojej opinii)
a_horse_with_no_name
2
Działa dla mnie w Oracle.
MonkeyWithDarts
1
I dla tego, czego potrzebowałem, aby umieścić „Nowy Jork” (lub inną wartość) na końcu, po prostu zamień 1 i 2 ... KOLEJNOŚĆ WEDŁUG PRZYPADKU, KIEDY miasto = „Nowy Jork” WTEDY 2 INNE 1 KONIEC, miasto
deebs
4
Ta ELSE 2sekcja oznacza, że ​​podczas gdy Nowy Jork otrzymuje wartość 1, wszystkie inne wartości otrzymują wartość 2. ... przynajmniej jeśli chodzi o porządek sortowania.
Rob Farley,
106

Jeśli Twój dialekt SQL jest wystarczająco inteligentny, aby traktować wyrażenia boolowskie jako mające wartość liczbową, możesz użyć:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
chaos
źródło
1
@MehrdadAfshari: Nie, MSSQL jest zbyt głupi, aby przetwarzać testy równoważności w ORDER BYklauzuli.
chaos
@a_horse_with_no_name: Czy próbowałeś uruchomić powyższe zapytanie przeciwko MSSQL?
chaos
11
@chaos: powyższa instrukcja rzeczywiście nie działa z SQL Server, ale to dlatego, że składnia jest niestandardowa i działa tylko dla MySQL. Używając CASEinstrukcji (która jest standardowym SQL) SQL Server może bardzo dobrze użyć wyrażenia w ORDER BYklauzuli. „ zbyt głupi, by przetwarzać testy równoważności ” jest po prostu błędem. Jeśli w ogóle powinno brzmieć: „ nie obsługuje niejawnego rzutowania wartości logicznej truena wartość 1(jeden) MySQL.
a_horse_with_no_name
@ Esraa_92: Więc nie masz dialektu SQL, który by sobie z tym poradził i potrzebujesz odpowiedzi Roba Farleya.
chaos
5
W przypadku Postgres zadziałało to dla mnie:ORDER BY id = 123 DESC, name ASC
user1032752
4

Moja odpowiedź może być stara i niewymagana, ale ktoś może potrzebować innego podejścia, dlatego zamieszczam ją tutaj.

Miałem ten sam wymóg zaimplementowany, zadziałał dla mnie.

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

PS

to jest dla SQL

Manjuboyz
źródło