使用 SQL ORDER BY 处理复杂条件
-
29-09-2020 - |
解决方案
你只需要一个 CASE
表达于 ORDER BY
, ,将行分为两组,因此类 'A' 或 'B' 的行被放入第一组 (1
)和第二个中的所有其他人(2
):
ORDER BY
CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
rank ;
其他提示
我将为您提供一种方法,其中我使用CTE,这些数据库中可用的CTE,特别是我熟悉的PostgreSQL。
ctes和WITH
子句
ctes 允许您要形成临时,单查询表,如结构,但由于您可以在单个查询中使CTE依赖于另一个,因此提供了一种方便且易于理解的方式来使您的查询半程序。
在您的情况下,我会尝试
WITH AB_results AS(
SELECT class, rank, 1 AS hidden_rank
FROM my_relation
WHERE class IN ('A','B')
),
Non_AB_results AS(
SELECT class, rank, 2 AS hidden_rank
FROM my_relation
WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;
.
我会在这里几分钟后尝试在一起的一个sqlfiddle,只是为了确保我没有得到一些错误的错误。 :p
编辑:我确实发出了一个小错误。试图在我们说话的一个例子中清理它。
编辑2:现在纠正错误!不幸的是,SQLFiddle现在有点麻烦,但 这里 是对SQLFIDDLE的链接进行一些测试。
请注意,我可能没有以最优雅的方式解决这个问题,但它应该解决您的问题。
不隶属于 dba.stackexchange