Ответ 1
...
ORDER BY CASE WHEN YourField = '' THEN 2 ELSE 1 END, YourField
Я пытаюсь выполнить процедуру сортировки, которая будет сортироваться в соответствии со значением выпадающего списка. Случается, что когда список сортируется, поля NULL будут заменены указанным значением замены, в этом случае ''
. Сначала это сортируется, потому что мы сортируем по возрастанию, теперь я хочу сортировать по возрастанию, но с нулевыми значениями LAST. Как я мог это реализовать?
ORDER BY l.IsActive DESC,
CASE WHEN @SortOrder = 1 THEN n.DisplayName
WHEN @SortOrder = 2 THEN CASE ec.IsEquipmentRelated
WHEN 1 THEN ISNULL(el.ShopID,'') +
ISNULL(ec.EquipmentAbbr,'') +
ISNULL(el.ClassSequenceNumber,'') +
ISNULL(el.EquipmentComponent,'') +
ISNULL(el.CompSequenceNumber,'')
WHEN 0 THEN ISNULL(ec.EquipmentAbbr,'')
ELSE NULL
END
ELSE l.DisplayName
END
Изменение: запуск MS SQL Server 2008/T-SQL
Редактировать: @Joe Stefanelli, я пробовал это, это не компиляция:
ORDER BY l.IsActive DESC,
CASE WHEN @SortOrder = 0 THEN l.DisplayName
WHEN @SortOrder = 1 THEN CASE WHEN n.DisplayName = '' THEN 2 ELSE 1 END, n.DisplayName
WHEN @SortOrder = 2 THEN
CASE ec.IsEquipmentRelated
WHEN 1 THEN ISNULL(el.ShopID,'') +
ISNULL(ec.EquipmentAbbr,'') +
ISNULL(el.ClassSequenceNumber,'') +
ISNULL(el.EquipmentComponent,'') +
ISNULL(el.CompSequenceNumber,'')
WHEN 0 THEN ISNULL(ec.EquipmentAbbr,'')
ELSE NULL
END
END
...
ORDER BY CASE WHEN YourField = '' THEN 2 ELSE 1 END, YourField
Лучший способ - добавить производный столбец, который будет иметь значения порядка сортировки (CASE, который проверяет, является ли другой столбец нулевым), а затем упорядочить по этому столбцу.
Ваш второй фрагмент не будет компилироваться, потому что вы пытаетесь вернуть более одного значения в WHEN @SortOrder = 1
внешнего CASE. Вы можете исправить это, если вы сделали пару крошечных изменений в указанной ветке:
Измените 2
и 1
на, например, '2'
и '1'
соответственно.
Замените запятую (,
) оператором конкатенации (+
).
И поэтому результат ORDER BY будет выглядеть так:
ORDER BY
l.IsActive DESC,
CASE
WHEN @SortOrder = 0 THEN l.DisplayName
WHEN @SortOrder = 1 THEN
CASE WHEN n.DisplayName = '' THEN '2' ELSE '1' END + n.DisplayName
WHEN @SortOrder = 2 THEN
CASE ec.IsEquipmentRelated
WHEN 1 THEN
ISNULL(el.ShopID,'') +
ISNULL(ec.EquipmentAbbr,'') +
ISNULL(el.ClassSequenceNumber,'') +
ISNULL(el.EquipmentComponent,'') +
ISNULL(el.CompSequenceNumber,'')
WHEN 0 THEN
ISNULL(ec.EquipmentAbbr,'')
ELSE NULL
END
END
ОК! Я нашел способ решить эту проблему, используя все три ответа в сочетании. +1 за каждый ответ! Сначала я создал "виртуальный" производный столбец, назначив нулевые значения 1 и ненулевым значениям 0, сначала отсортировав их, а затем отсортировав остальные:
ORDER BY
l.IsActive DESC,
CASE
WHEN @SortOrder = 0 THEN (Case When l.DisplayName Is Null Then 1 Else 0 End)
WHEN @SortOrder = 1 THEN (Case When n.DisplayName Is Null Then 1 Else 0 End)
WHEN @SortOrder = 2 THEN (Case When ec.EquipmentAbbr Is Null Then 1 Else 0 End)
END,
CASE
WHEN @SortOrder = 0 THEN l.DisplayName
WHEN @SortOrder = 1 THEN n.DisplayName
WHEN @SortOrder = 2 THEN
ISNULL(el.ShopID,'') +
ISNULL(ec.EquipmentAbbr,'') +
ISNULL(el.ClassSequenceNumber,'') +
ISNULL(el.EquipmentComponent,'') +
ISNULL(el.CompSequenceNumber,'')
END
Таким образом, сортировка, если поле является нулевым или нет, выполняется до фактической сортировки, которая возвращает нулевые значения в конце.