假设我们有以下People表:
Name | Id | Employee type
-------------------------------
Max | 2 | Engineer
Alice | 3 | Scientist
Bob | 1 | Scientist
John | 4 | Engineer
Jane | 5 | Engineer
现在我们想对它们进行如下排序:首先是科学家,然后是工程师。科学家应按 name 升序排列,工程师应按 id 降序排列。
因此,结果应该是
Name | Id | Employee type
-------------------------------
Alice | 3 | Scientist
Bob | 1 | Scientist
Jane | 5 | Engineer
John | 4 | Engineer
Max | 2 | Engineer
当然,我可以先对工程师运行一个查询,然后再对科学家运行另一个查询。但是,我想知道是否还有其他更优雅的解决方案。
我现在的问题是,我们如何才能实现优雅的查询?理想情况下,您可以将 is 制定为 sqlalchemy 查询,但简单的 SQL 语句也会有很大帮助。
根据您对优雅的定义,您可以使用
case
语句和子查询:
select p.* from people p order by case when p.employee_type = "Scientist" then p.name else (select max(p1.id) from people p1) - p.id