如何将具有特定值的行放在前面返回?

136

我希望我的查询返回表中包含特定值的列的行,然后按字母顺序返回其余行。

如果我有这样一个示例表:

 - 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
3个回答

218

在SQL Server、Oracle、DB2和许多其他数据库系统中,您可以使用以下内容:

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

这实际上适用于任何SQL数据库(在我看来,这比被接受的答案更为简洁)。 - user330315
2
在Oracle中对我有效。 - MonkeyWithDarts
我该如何在“城市”列后添加“姓名”列? - stack
1
而对于我需要将“纽约”(或其他值)放在最后的情况,只需交换1和2...按CASE WHEN city ='New York' THEN 2 ELSE 1 END,city排序。 - deebs
4
“ELSE 2”部分的意思是,尽管纽约得到值1,但所有其他值都得到值2。就排序顺序而言至少是这样。 - Rob Farley
显示剩余4条评论

107

如果你的SQL方言足够智能,可以将布尔表达式视为数值,那么你可以使用:

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

1
@MehrdadAfshari:不,MSSQL太愚蠢了,无法在“ORDER BY”子句中处理等价性测试。 - chaos
@a_horse_with_no_name: 你尝试过在MSSQL上运行以上查询吗? - chaos
11
@chaos:以上声明确实不适用于SQL Server,因为语法是非标准的,只适用于MySQL。当使用标准SQL的“CASE”语句时,SQL Server可以在“ORDER BY”子句中使用表达式。"太愚蠢无法处理等价测试"是错误的。如果需要更正,应该写成:"不支持MySQL将布尔值true隐式转换为值1(one)"。 - user330315
@Esraa_92:那么你没有一个能够处理它的SQL方言,你需要Rob Farley的答案。 - chaos
6
对于Postgres数据库,以下语句适用:ORDER BY id = 123 DESC, name ASC - user1032752

6

我的回答可能有点过时,也许不是必需的,但是有些人可能需要不同的方法,因此在这里发布。

我有同样的需求,实现了这个方法,对我有效。

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

注:本文与SQL相关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接