Bagaimana cara mengembalikan baris dengan nilai tertentu terlebih dahulu?

124

Saya ingin kueri saya mengembalikan baris tabel di mana kolom berisi nilai tertentu terlebih dahulu, lalu mengembalikan sisa baris menurut abjad.

Jika saya memiliki tabel seperti contoh ini:

 - 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

Dan menggunakan tabel itu, saya ingin kueri saya mengembalikan baris yang berisi New York terlebih dahulu, dan kemudian baris lainnya diurutkan berdasarkan kota. Apakah ini mungkin dilakukan dengan hanya menggunakan satu kueri?

Phoexo
sumber
Pertimbangkan untuk mengubah jawaban yang diterima menjadi yang kedua jika Anda bisa, karena yang pertama hanya berfungsi untuk MySQL dan bukan untuk MSSQL.
Magisch
Selesai. Pertanyaan awal saya adalah tentang MySQL, tetapi tagnya tidak mencerminkan hal itu.
Phoexo
Terima kasih. Saya menemukan pagi ini dalam upaya untuk melakukan sesuatu yang serupa untuk masalah yang saya miliki. :)
Magisch

Jawaban:

195

Di SQL Server, Oracle, DB2, dan banyak sistem database lainnya, inilah yang dapat Anda gunakan:

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Rob Farley
sumber
1
Terima kasih! Membantu saya di
MsSQL
Itu benar-benar berfungsi dalam database SQL apa pun (dan merupakan solusi yang jauh lebih bersih daripada jawaban yang diterima menurut saya)
a_horse_with_no_name
2
Bekerja untuk saya di Oracle.
MonkeyWithDarts
1
Dan untuk apa yang saya butuhkan untuk menempatkan 'New York' (atau nilai lain) terakhir, cukup tukar 1 dan 2 ... ORDER BY CASE WHEN city = 'New York' THEN 2 ELSE 1 END, city
deebs
4
The ELSE 2Bagian berarti bahwa sementara New York mendapat nilai 1, semua nilai-nilai lain mendapatkan nilai 2. ... setidaknya sejauh urutan yang bersangkutan.
Rob Farley
106

Jika dialek SQL Anda cukup cerdas untuk memperlakukan ekspresi boolean sebagai nilai numerik, Anda dapat menggunakan:

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
kekacauan
sumber
1
@MehrdadAfshari: Tidak, MSSQL terlalu bodoh untuk memproses uji kesetaraan dalam ORDER BYklausa.
kekacauan
@a_horse_with_no_name: Sudahkah Anda mencoba menjalankan kueri di atas terhadap MSSQL?
kekacauan
11
@chaos: pernyataan di atas memang tidak berjalan dengan SQL Server, tetapi itu karena sintaksnya tidak standar dan hanya berfungsi untuk MySQL. Saat menggunakan CASEpernyataan (yang merupakan SQL standar) SQL Server dapat menggunakan ekspresi dalam ORDER BYklausa dengan sangat baik . " terlalu bodoh untuk memproses uji kesetaraan " adalah salah. Jika semuanya harus terbaca: " tidak mendukung casting implisit MySQL dari boolean trueke nilai 1(satu). "
a_horse_with_no_name
@ Esraa_92: Maka Anda tidak memiliki dialek SQL yang dapat mengatasinya dan Anda memerlukan jawaban Rob Farley.
kekacauan
5
Untuk Postgres, ini berhasil untuk saya: ORDER BY id = 123 DESC, name ASC
user1032752
4

Jawaban saya mungkin lama dan tidak wajib tetapi seseorang mungkin membutuhkan pendekatan yang berbeda, maka posting di sini.

Saya memiliki persyaratan yang sama menerapkan ini, bekerja untuk saya.

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

PS

ini untuk SQL

Manjuboyz
sumber