Сортировка пустых значений последняя вместо первой - PullRequest
17 голосов
/ 29 июня 2011

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

Edit: @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

Ответы [ 4 ]

30 голосов
/ 29 июня 2011
...
ORDER BY CASE WHEN YourField = '' THEN 2 ELSE 1 END, YourField
3 голосов
/ 29 июня 2011

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

2 голосов
/ 29 июня 2011

Ваш второй фрагмент не будет скомпилирован, потому что вы пытаетесь вернуть более одного значения в ветви 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
1 голос
/ 30 июня 2011

OK!Я нашел способ решить эту проблему, используя все три ответа вместе.+1 за каждый ответ!Сначала я создал «виртуальный» производный столбец, присваивая нулевые значения 1 и ненулевые значения 0, сначала сортируя их, затем сортируя остальные:сортировка, если поле является нулевым или нет, выполняется до того, как будет выполнена фактическая сортировка, что приводит к нулю значений в конце.

...