【发布时间】:2011-09-16 03:42:17
【问题描述】:
我有很多关于结果集必须如何排序的规则。我需要使用 CASE 来计算要排序的列。
我正在尝试这个:
ORDER BY
CASE
WHEN ISNULL(actual_appearance_date, scheduled_appearance_date) IS NOT NULL AND icbm.emma_id IS NOT NULL -- We have it all!
THEN ISNULL(actual_appearance_date, scheduled_appearance_date) DESC , icbm.emma_id , version_number , icaci_t.[ijis_court_appearance_court_item_tracker_id]
WHEN ISNULL(actual_appearance_date, scheduled_appearance_date) IS NOT NULL AND icbm.emma_id IS NULL -- We have an appearance date, but it's manual.
THEN ISNULL(actual_appearance_date, scheduled_appearance_date) DESC, icaci_t.[ijis_court_appearance_court_item_tracker_id] DESC
WHEN ISNULL(actual_appearance_date, scheduled_appearance_date) IS NULL AND icbm.emma_id IS NOT NULL -- No appearance date, but it has a Business Message
THEN icbm.emma_id DESC, version_number DESC, icaci_t.[ijis_court_appearance_court_item_tracker_id] DESC
ELSE icaci_t.[ijis_court_appearance_court_item_tracker_id] DESC -- No Appearance date, not Message.
END
但似乎我只能在 THEN 之后包含一列。但我需要根据我的规则使用几列。
有没有办法做到这一点?
【问题讨论】:
-
您可以在子查询的选择子句中使用这个丑陋的代码,无需排序,然后在父查询中按一列排序
-
@Andrey:但是每个 THEN 都想返回多个要订购的东西。我认为您需要四个条件相同的 CASE(每个要排序的组件一个);或者,如果 SQL Server 支持数组并对它们进行合理排序,那么您可以从 CASE 的每个分支返回数组(我认为 PostgreSQL 会支持这种诡计,不知道 SQL Server)。
-
@mu 太短:T-SQL 中没有数组。
-
您也可以在没有列可排序的情况下为每一列重复一次逻辑,并在这种情况下替换一个常量值,但我想这会比子查询更丑陋。
-
OP 中思想的核心问题当然是,您不能告诉 SQL 根据一行中的值对不同列的整个结果进行排序。
标签: sql sql-server tsql sql-order-by