在订单依据中使用CASE

时间:2011-09-16 03:42:17

标签: sql sql-server tsql sql-order-by

我有很多关于如何订购结果集的规则。我需要使用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

但似乎我只能在那之后包含一列。但是我需要根据我的规则使用几列。

有办法做到这一点吗?

3 个答案:

答案 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(例如上面),以便订单正确。如果您想要按降序列的顺序,则可以反转该字符串。

此解决方案可行,但在道德上令人震惊,因此请立即使用它。