Як спочатку повернути рядки з певним значенням?


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.
Магіш

Зроблено. Моє первісне запитання стосувалося MySQL, але теги все одно не відображали це.
Phoexo

Дякую. Я зіткнувся з цим сьогодні вранці, прагнучи зробити щось подібне для проблеми, яка була в мене. :)
Magisch

Відповіді:


195

Для SQL Server, Oracle, DB2 та багатьох інших систем баз даних ви можете використовувати:

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

1
Дякую! Допоміг мені в MsSQL
Rexxo

Це насправді працює в будь-якій базі даних SQL (і є набагато більш чистим рішенням, ніж прийнята відповідь на мій погляд)
a_horse_with_no_name

2
Працює для мене в Oracle.
MonkeyWithDarts

1
І для того, що мені потрібно було помістити "Нью-Йорк" (або інше значення) останньою, просто поміняйте місцями 1 і 2 ... ЗАМОВИТИ
ДЛЯ СЛУЧАЮ

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пункті. " занадто нерозумно обробляти тести на еквівалентність " - просто неправильно. Якщо взагалі слід сказати: " не підтримує неявне введення MySQL з булевого значення trueв значення 1(один) "
a_horse_with_no_name

@ Esraa_92: Тоді у вас немає діалекту SQL, який би впорався з цим, і вам потрібна відповідь Роб Фарлі.
хаос

5
Для Postgres це працювало для мене:ORDER BY id = 123 DESC, name ASC
user1032752

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.