假设我的关系是这样的

enter image description here

我想按等级排序,但 A 和 B 排在第一位。所以我的关系看起来像

enter image description here

起初,我尝试只建立两个关系,我按等级对它们进行排序,然后将这两个关系合并,但它们最终会混在一起。我也尝试过使用案例,但我不明白它是如何工作的。我不断收到有关将字符与整数混合的错误。

编辑:忘记提及上面的第一个关系是我在经过一些复杂的视图之后最终得到的。例如,我创建了两个视图,其中一个只有 A 类和 B 类,然后我按排名对其进行排序。第二个视图只是 C 级,按等级排序。然后我把它们联合起来,但它们只是混合在一起。

有帮助吗?

解决方案

你只需要一个 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的链接进行一些测试。

请注意,我可能没有以最优雅的方式解决这个问题,但它应该解决您的问题。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top