2009-08-08 13 views
99

Chcę, aby moje zapytanie zwróciło wiersze tabeli, w których kolumna zawiera określoną wartość, a następnie zwraca pozostałe wiersze alfabetycznie.Jak w pierwszej kolejności zwracać wiersze o określonej wartości?

Jeśli mam coś stół 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 

i za pomocą tej tabeli chcę, aby moje zapytanie do powrotu wiersze, które zawierają w Nowym Jorku, a potem reszta rzędach alfabetycznie według miast . Czy można to zrobić za pomocą tylko jednego zapytania?

+0

Rozważ zmianę przyjętej odpowiedź na drugim, jeśli można, jako pierwsza działa tylko dla MySQL, a nie dla MSSQL. – Magisch

+0

Gotowe. Moje pierwotne pytanie dotyczyło MySQL, ale znaczniki tego nie odzwierciedlały. – Phoexo

+0

Dziękuję. Dziś rano natknąłem się na to, próbując zrobić coś podobnego z powodu mojego problemu. :) – Magisch

Odpowiedz

159

na SQL Server, Oracle, DB2, i wiele innych systemów baz danych, to co można użyć:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city 
+0

W ten sposób działa w' db2'. – Samiron

+4

Doskonały, działa również w MSSQL. – Josh

+2

To działa, zaakceptowana odpowiedź nie. –

92

Jeśli SQL dialekt jest wystarczająco inteligentny, aby traktować wyrażeń logicznych jako posiadające wartość liczbową, a następnie można użyć:

SELECT * 
FROM `Users` 
ORDER BY (`city` = 'New York') DESC, `city` 
+2

Ta odpowiedź sprawia, że ​​czuję się głupio. Dobrze zrobiony chaos. – Bill

+2

Czy działa na MSSQL? –

+1

@MehrdadAfshari: Nie, MSSQL jest zbyt głupi, aby przetworzyć testy równoważności w klauzuli "ORDER BY". – chaos

2

Moja odpowiedź może być stary i nie jest wymagane, ale ktoś może potrzebować innego podejścia, stąd umieszczenie go tutaj.

Miałem taki sam wymóg wdrożyć to, pracował dla mnie.

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

PS

to dla SQL

Powiązane problemy