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?


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

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`

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.