Làm cách nào để trả về các hàng có giá trị cụ thể trước?


124

Tôi muốn truy vấn của mình trả về các hàng của bảng trong đó một cột chứa một giá trị cụ thể trước, sau đó trả về phần còn lại của các hàng được sắp xếp theo thứ tự.

Nếu tôi có một bảng giống như ví dụ này:

 - 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

Và khi sử dụng bảng đó, tôi muốn truy vấn của mình để trả về các hàng có chứa New York trước, và sau đó là các hàng còn lại được sắp xếp theo thứ tự thành phố. Điều này có thể làm chỉ bằng một truy vấn?


Cân nhắc thay đổi câu trả lời được chấp nhận sang câu trả lời thứ hai nếu bạn có thể, vì câu trả lời đầu tiên chỉ hoạt động cho MySQL chứ không phải cho MSSQL.
Magisch

Làm xong. Câu hỏi ban đầu của tôi là về MySQL, nhưng các thẻ không phản ánh điều đó.
Phoexo

Cảm ơn bạn. Tôi đã đi qua sáng nay trong một nỗ lực để làm một cái gì đó tương tự cho một vấn đề tôi gặp phải. :)
Magisch

Câu trả lời:


195

Trên SQL Server, Oracle, DB2 và nhiều hệ thống cơ sở dữ liệu khác, đây là những gì bạn có thể sử dụng:

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

1
Cảm ơn! Đã giúp tôi trong
MsQuery

Điều đó thực sự hoạt động trong bất kỳ cơ sở dữ liệu SQL nào (và là một giải pháp sạch hơn nhiều so với câu trả lời được chấp nhận theo ý kiến ​​của tôi)
a_horse_with_no_name

2
Làm việc cho tôi trong Oracle.
MonkeyWithDarts

1
Và với những gì tôi cần để đặt 'New York' (hoặc giá trị khác) cuối cùng, chỉ cần trao đổi 1 và 2 ... ĐẶT HÀNG
B CASNG

4
Phần ELSE 2này có nghĩa là trong khi New York có giá trị 1, thì tất cả các giá trị khác đều nhận được giá trị 2. ... ít nhất là theo thứ tự sắp xếp.
Rob Farley

106

Nếu phương ngữ SQL của bạn đủ thông minh để coi các biểu thức boolean là có một giá trị số, thì bạn có thể sử dụng:

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

1
@MehrdadAfshari: Không, MSSQL quá ngu ngốc để xử lý các bài kiểm tra tương đương trong ORDER BYmệnh đề.
hỗn loạn

@a_horse_with_no_name: Bạn đã thử chạy truy vấn trên đối với MSSQL chưa?
hỗn loạn

11
@chaos: câu lệnh trên thực sự không chạy với SQL Server, nhưng đó là vì cú pháp không chuẩn và chỉ hoạt động với MySQL. Khi sử dụng một CASEcâu lệnh (là SQL chuẩn) SQL Server rất có thể sử dụng một biểu thức trong ORDER BYmệnh đề. " quá ngu ngốc để xử lý các bài kiểm tra tương đương " đơn giản là sai. Nếu hoàn toàn nên đọc: " không hỗ trợ việc đúc boolean ngầm của MySQL truethành giá trị 1(một). "
a_horse_with_no_name

@ Esraa_92: Sau đó, bạn không có một phương ngữ SQL có thể xử lý nó và bạn cần câu trả lời của Rob Farley.
hỗn loạn

5
Đối với Postgres, điều này hiệu quả với tôi:ORDER BY id = 123 DESC, name ASC
user1032752

4

Câu trả lời của tôi có thể cũ và không bắt buộc nhưng ai đó có thể cần cách tiếp cận khác, do đó đăng nó ở đây.

Tôi đã có cùng yêu cầu thực hiện điều này, làm việc cho tôi.

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

PS

cái này dành cho SQL

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.