Использование CASE в заказе - PullRequest
       2

Использование CASE в заказе

2 голосов
/ 16 сентября 2011

У меня есть множество правил о том, как должен быть упорядочен набор результатов. Мне нужно использовать 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 ]

4 голосов
/ 16 сентября 2011

Упорядочивать набор результатов по разным правилам в разных строках не имеет смысла, так как конфликтующие правила будут создавать несоответствия в том, как выполняются отдельные упорядочения между строками. Другими словами, нет последовательного порядка, если правила порядка несовместимы.

Однако я подозреваю, что вы делаете эту проблему намного сложнее, чем нужно. Я подозреваю, что вы можете просто заказать по:

ISNULL(actual_appearance_date, scheduled_appearance_date) DESC , icbm.emma_id , version_number , icaci_t.[ijis_court_appearance_court_item_tracker_id] 

Значения NULL сортируются и сортируются вместе. Возможно, начните отсюда и выясните, что нужно изменить.

0 голосов
/ 16 сентября 2011

Хорошо, есть один способ, которым вы можете сделать это, но это Гадкий уродливый взлом.

Просто объедините ваши столбцы (преобразуйте их, если они не являются varchars) и добавьте их слева направо.

ТО ВЫБРАТЬ (КОНВЕРТ (VARCHAR (10), фактическое_падение_дата, 111)) + конвертировать (VARCHAR, emma_id)

Вам нужно будет убедиться, что ваша строка даты отформатирована ГГГГ, ММ, ДД (как указано выше), чтобы порядок был правильным. Если вы хотите упорядочить по убыванию столбца, вы можете перевернуть строку.

Это решение будет работать, но морально ужасно, поэтому используйте его на свой страх и риск.

0 голосов
/ 16 сентября 2011

В 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;
...