如何首先返回具有特定值的行?


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

做完了 我最初的问题是关于MySQL的,但是这些标签仍然没有反映出来。
Phoexo

谢谢。今天早上我碰到了这个问题,试图为遇到的问题做类似的事情。:)
Magisch

Answers:


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 2013年

2
在Oracle中为我工作。
MonkeyWithDarts

1
对于我需要最后放置“ New York”(或另一个值)的内容,只需将1和2交换...当City ='New York'时按情况订购THEN 2 ELSE 1 END,city
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子句中使用表达式。“ 太愚蠢而无法进行等效性测试 ”完全是错误的。如果有的话,它应该显示为:“ 不支持MySQL将布尔true值隐式转换为值1(one)。
a_horse_with_no_name 2013年

@ Esraa_92:那么您没有可以处理它的SQL方言,您需要Rob Farley的答案。
混乱

5
对于Postgres,这对我ORDER BY id = 123 DESC, name ASC
有用

4

我的答案可能很旧,不需要,但是有人可能需要其他方法,因此请在此处发布。

我有同样的要求来实现这一点,为我工作。

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

聚苯乙烯

这是用于SQL

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.