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

Pho*_*exo 120 sql sql-order-by

我希望我的查询返回表的行,其中列首先包含一个特定的值,然后返回按字母顺序排列的其余行.

如果我有一个像这个例子的表:

 - 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
Run Code Online (Sandbox Code Playgroud)

并且使用该表我希望我的查询首先返回包含New York的行,然后返回按城市按字母顺序排列的其余行.这可能只使用一个查询吗?

Rob*_*ley 188

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

ORDER BY CASE WHEN city = 'New York' THEN 1 ELSE 2 END, city
Run Code Online (Sandbox Code Playgroud)

  • "ELSE 2"部分意味着当纽约得到值1时,所有其他值得到值2. ...至少就排序顺序而言. (4认同)
  • 适用于Oracle. (2认同)

cha*_*aos 102

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

SELECT *
FROM `Users`
ORDER BY (`city` = 'New York') DESC, `city`
Run Code Online (Sandbox Code Playgroud)

  • @chaos:上面的语句确实*不能与SQL Server一起运行,但这是因为语法是非标准的,只适用于MySQL.使用`CASE`语句(标准SQL)时,SQL Server可以很好地使用`ORDER BY`子句中的表达式."*过于愚蠢以处理等效性测试*"是完全错误的.如果它应该读取:"*不支持MySQL的隐式转换布尔值`true`到值`1`(一).*" (11认同)
  • 对于Postgres,这对我有用:`ORDER BY id = 123 DESC,名称为ASC` (5认同)
  • 这个答案让我感到愚蠢.干得好乱. (2认同)
  • @chaos:这是完全错误的.Se Rob Farley的回答. (2认同)

Man*_*oyz 6

我的答案可能是旧的并且不是必需的,但有人可能需要不同的方法,因此将其发布在这里。

我有同样的要求实现了这个,为我工作。

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

聚苯乙烯

这是针对SQL的