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


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

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


Подумайте об изменении принятого ответа на второй, если можете, поскольку первый работает только для 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.