假设我们有以下People个表:

  Name  | Id  | Employee type
-------------------------------
  Max   | 2   | Engineer
  Alice | 3   | Scientist
  Bob   | 1   | Scientist
  John  | 4   | Engineer
  Jane  | 5   | Engineer

现在我们想对他们进行如下排序:首先是科学家,然后是工程师.科学家应该按name in ascending order人排序,工程师按id in descending order人排序.

因此,结果应该是

  Name  | Id  | Employee type
-------------------------------
  Alice | 3   | Scientist
  Bob   | 1   | Scientist
  Jane  | 5   | Engineer
  John  | 4   | Engineer
  Max   | 2   | Engineer

当然,我可以先为工程师运行一个查询,然后再为科学家运行另一个查询.然而,我想知道是否还有其他更优雅的解决方案.

我现在的问题是,我们如何才能实现我们优雅的查询?理想情况下,您可以将IS表示为一个SQL查询,但一条简单的SQL语句也会有很大帮助.

推荐答案

order by子句中使用两个case语句:

select p.* from people p order by p.employee_type desc, 
      case when p.employee_type = 'Scientist' then p.name else '' end asc,
      case when p.employee_type = 'Engineer' then p.id else '' end desc

See fiddle

Sql相关问答推荐

SQL计数所有值在联接范围内的行

无效和不匹配的计数

为表中每个缺少的引用创建新行

一个SQL查询将在需要的地方多次返回同一成员

从JSON值数组创建扁平数组Athena

聚合内部的条件在哪里?

将 jsonb 数组中的对象取消嵌套到单独的行中

将 json 列键映射到第二个表中的匹配列值

SQL Server 查询 WHERE LIKE

如何向 mariadb 添加外键?

Postgresql:在链接表中判断相关表中插入值的条件

SQL 多个不满足的条件失败

达到特定值时,从0开始累加求和

SQL:无重复项的两个聚合函数

强制 SQL 始终通过 R 从视图中返回至少一行

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列

创建一个将层次 struct 级别放入列中的查询

SQL Group By 然后映射出是否存在值

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数