我有很多关于如何订购结果集的规则。我需要使用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
但似乎我只能在那之后包含一列。但是我需要根据我的规则使用几列。
有办法做到这一点吗?
答案 0 :(得分:4)
根据不同行的不同规则对结果集进行排序实际上没有意义,因为冲突的规则会在行之间的各个排序之间产生不一致。换句话说,如果排序规则不一致,则没有一致的排序。
但是我怀疑你使这个问题比它需要的要复杂得多。我怀疑你可以通过以下方式订购:
ISNULL(actual_appearance_date, scheduled_appearance_date) DESC , icbm.emma_id , version_number , icaci_t.[ijis_court_appearance_court_item_tracker_id]
NULL值将自行排序并一起排序。也许从这里开始,找出需要改变的地方。
答案 1 :(得分:0)
在T-SQL中,CASE
是一个返回单个值的表达式,而不是流语句的控件(就像在某些语言中一样)。因此,您需要重复可能需要多列的表达式...并且每个表达式都需要返回兼容的数据类型。这里可能有一些快捷方式,我可能错过了一些逻辑,但如果你为其中一些列创建别名然后使用子查询,它可以帮助使所有CASE结构更容易。
SELECT * FROM
(
SELECT
/* other columns */
as_date = COALESCE(actual_appearance_date, scheduled_appearance_date),
emma_id = icbm.emma_id,
vn = version_number,
ca = icaci_t.[ijis_court_appearance_court_item_tracker_id]
/* rest of query */
) AS x
ORDER BY
CASE WHEN as_date IS NOT NULL THEN as_date END DESC,
CASE WHEN as_date IS NOT NULL AND emma_id IS NOT NULL THEN emma_id END,
CASE WHEN as_date IS NOT NULL AND emma_id IS NULL THEN ca END DESC,
CASE WHEN as_date IS NULL AND emma_id IS NOT NULL THEN emma_id DESC,
CASE WHEN as_date IS NOT NULL AND emma_id IS NOT NULL THEN vn END,
CASE WHEN as_date IS NULL AND emma_id IS NOT NULL THEN vn END DESC,
CASE WHEN as_date IS NULL AND emma_id IS NOT NULL THEN ca END DESC,
ca DESC;
答案 2 :(得分:0)
好的,有一种方法可以做到,但这是一个UGLY UGLY hack。
简单地连接您的列(如果它们不是varchars则转换它们)并从左到右添加它们。
那么SELECT(CONVERT(VARCHAR(10),actual_appearance_date,111))+ convert(VARCHAR,emma_id)
您需要确保您的日期字符串格式为YYYY,MM,DD(例如上面),以便订单正确。如果您想要按降序列的顺序,则可以反转该字符串。
此解决方案可行,但在道德上令人震惊,因此请立即使用它。