Как мне сначала вернуть строки с определенным значением?

124

Я хочу, чтобы мой запрос возвращал строки таблицы, в которой столбец сначала содержит определенное значение, а затем возвращал остальные строки в алфавитном порядке.

Если у меня есть таблица, похожая на этот пример:

 - 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

И, используя эту таблицу, я хочу, чтобы мой запрос возвращал сначала строки, содержащие Нью-Йорк, а затем остальные строки в алфавитном порядке по городам. Можно ли это сделать с помощью одного запроса?

Phoexo
источник
Подумайте об изменении принятого ответа на второй, если можете, поскольку первый работает только для MySQL, а не для MSSQL.
Magisch 06
Готово. Мой первоначальный вопрос касался MySQL, но теги все равно этого не отражали.
Phoexo 06
Спасибо. Сегодня утром я наткнулся на попытку сделать что-то подобное для моей проблемы. :)
Magisch 06

Ответы:

195

В SQL Server, Oracle, DB2 и многих других системах баз данных вы можете использовать следующее:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Роб Фарли
источник
1
Спасибо! Помогли мне в
MsSQL
Это действительно работает в любой базе данных SQL (и, на мой взгляд, это гораздо более чистое решение, чем принятый ответ)
a_horse_with_no_name
2
У меня работает в Oracle.
MonkeyWithDarts
1
И за то , что мне нужно место 'Нью - Йорк' (или другое значение) в прошлом, просто поменять 1 и 2 ... ORDER BY случай , когда город = 'New York' THEN 2 ELSE 1 END, город
deebs
4
В ELSE 2разделе означает , что в то время как Нью - Йорк получает значение 1, все остальные значения получить значение 2. ... по крайней мере, насколько порядок сортировки обеспокоен.
Роб Фарли
106

Если ваш диалект SQL достаточно умен, чтобы обрабатывать логические выражения как имеющие числовое значение, вы можете использовать:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
хаос
источник
1
@MehrdadAfshari: Нет, MSSQL слишком глуп, чтобы обрабатывать тесты эквивалентности в этом ORDER BYпредложении.
хаос
@a_horse_with_no_name: Вы пробовали выполнить вышеуказанный запрос против MSSQL?
хаос
11
@chaos: приведенный выше оператор действительно не работает с SQL Server, но это потому, что синтаксис нестандартный и работает только для MySQL. При использовании CASEоператора (который является стандартным SQL) SQL Server вполне может использовать выражение в ORDER BYпредложении. « слишком глупо, чтобы проводить тесты на эквивалентность » просто неправильно. Если вообще он должен читать: « не поддерживает неявное приведение логического trueзначения MySQL к значению 1(единице). »
a_horse_with_no_name
@ Esraa_92: Значит, у вас нет диалекта SQL, который мог бы с этим справиться, и вам нужен ответ Роба Фарли.
хаос
5
Для Postgres это сработало для меня:ORDER BY id = 123 DESC, name ASC
user1032752 06
4

Мой ответ может быть старым и необязательным, но кому-то может потребоваться другой подход, поэтому разместите его здесь.

У меня было такое же требование, которое реализовало это, сработало для меня.

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

PS

это для SQL

Manjuboyz
источник