ฉันจะส่งคืนแถวที่มีค่าเฉพาะก่อนได้อย่างไร


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
mag

เสร็จสิ้น คำถามเดิมของฉันเกี่ยวกับ MySQL แต่แท็กก็ไม่ได้สะท้อนถึงสิ่งนั้น
Phoexo

ขอบคุณ. ฉันเจอเมื่อเช้านี้ด้วยความพยายามที่จะทำบางอย่างที่คล้ายกันสำหรับปัญหาที่ฉันมี :)
mag

คำตอบ:


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
และสำหรับสิ่งที่ฉันต้องการในการวาง 'New York' (หรือค่าอื่น) สุดท้ายเพียงแค่สลับ 1 และ 2 ... ORDER BY CASE WHEN city = 'New York' แล้ว 2 ELSE 1 END, city
deebs

4
ELSE 2ส่วนหมายถึงว่าในขณะที่นิวยอร์กได้รับค่า 1 ค่าอื่น ๆ ทั้งหมดได้รับค่า 2. ... อย่างน้อยเท่าที่เรียงลำดับเป็นห่วง
Rob Farley

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 ที่สามารถจัดการได้และคุณต้องการคำตอบของ Rob Farley
วุ่นวาย

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.