Сортировка пустых значений для последнего вместо первого

Я пытаюсь выполнить процедуру сортировки, которая будет сортироваться в соответствии со значением выпадающего списка. Случается, что когда список сортируется, поля 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

Ответ 1

...
ORDER BY CASE WHEN YourField = '' THEN 2 ELSE 1 END, YourField

Ответ 2

Лучший способ - добавить производный столбец, который будет иметь значения порядка сортировки (CASE, который проверяет, является ли другой столбец нулевым), а затем упорядочить по этому столбцу.

Ответ 3

Ваш второй фрагмент не будет компилироваться, потому что вы пытаетесь вернуть более одного значения в WHEN @SortOrder = 1 внешнего CASE. Вы можете исправить это, если вы сделали пару крошечных изменений в указанной ветке:

  1. Измените 2 и 1 на, например, '2' и '1' соответственно.

  2. Замените запятую (,) оператором конкатенации (+).

И поэтому результат 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

Ответ 4

ОК! Я нашел способ решить эту проблему, используя все три ответа в сочетании. +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

Таким образом, сортировка, если поле является нулевым или нет, выполняется до фактической сортировки, которая возвращает нулевые значения в конце.