logo

Сортировка NULL-значений в SQL Server: аналог Oracle's NULLS FIRST

Быстрый ответ

Чтобы значения NULL отображались в начале списка после сортировки в SQL Server, вы можете использовать конструкцию CASE в предложении ORDER BY. Пример:

SQL
Скопировать код
SELECT * FROM YourTable
ORDER BY CASE WHEN YourColumn IS NULL THEN 0 ELSE 1 END, YourColumn;

Этот запрос позиционирует NULL значения на верхних позициях списка путем присвоения им более низкого приоритетного значения (0) по сравнению с ненулевыми значениями (1), в результате чего они получают приоритет при сортировке по возрастанию.

Обратная сортировка – сортировка по убыванию

Иногда возникает необходимость отсортировать данные по убыванию, однако значения NULL должны оставаться в начале списка. В этом случае необходимо просто скорректировать числовые приоритеты:

SQL
Скопировать код
SELECT * FROM YourTable
ORDER BY CASE WHEN YourColumn IS NULL THEN 0 ELSE 1 END, YourColumn DESC;

Здесь значения NULL все еще занимают самые верхние позиции, а остальные данные упорядочиваются в порядке убывания, как звезды, опоздавшие на красную дорожку.

Дополнительные уловки

Волшебная функция ISNULL

Если вы считаете конструкцию CASE немного сложной, функция ISNULL() поможет вам просто и эффективно отсортировать значения:

SQL
Скопировать код
SELECT * FROM YourTable
ORDER BY ISNULL(YourColumn, 'AReallyLowValue'), YourColumn;

Совет: для 'AReallyLowValue' выберите значение, которое гарантированно будет меньше всех ваших данных.

Сортировка недатированных значений

Следующий подход подойдет для текстовых или числовых колонок:

SQL
Скопировать код
ORDER BY CASE WHEN YourColumn IS NULL THEN 0 ELSE 1 END, YourColumn DESC;

При работе с датами можно воспользоваться следующей схемой:

SQL
Скопировать код
ORDER BY CASE WHEN YourDateColumn IS NULL THEN '19000101' ELSE YourDateColumn END;

Профессиональный совет: '19000101' является способом отобразить NULL-даты как самые ранние, а значит наиболее приоритетные при сортировке.

Визуализация

Представьте себе список приглашенных на VIP-вечеринку, где NULL – это ваши специальные гости:

Markdown
Скопировать код
До сортировки: [Том, Джерри, NULL, Бэтмен, Человек-паук]
После сортировки аналогично Oracle's NULLS FIRST в SQL Server:
Markdown
Скопировать код
NULL (🌟 особый гость) ➡️ Бэтмен ➡️ Джерри ➡️ Человек-паук ➡️ Том

Так NULL (🌟) занимает первые места в списке, как звезды.

Настройка оператора CASE

Естественное поведение SQL Server

По умолчанию SQL Server считает NULL значения менее значимыми при сортировке по возрастанию и наиболее значимыми при сортировке по убыванию. Это поведение можно изменить с помощью CASE:

SQL
Скопировать код
-- 'Последними? Не может быть!' – подумает NULL
ORDER BY CASE WHEN YourColumn IS NULL THEN 1 ELSE 0 END, YourColumn;

-- 'Первыми? Это мы!' – подумает NULL при сортировке по убыванию
ORDER BY CASE WHEN YourColumn IS NULL THEN 1 ELSE 0 END, YourColumn DESC;

Ваш выбор! Сортировка в порядке возрастания или убывания

SQL дает вам возможность выбрать направление сортировки – по возрастанию или по убыванию. Достаточно просто настроить логику CASE WHEN и SQL выполнит ваше желание.

Пользовательское упорядочивание

Поскольку SQL Server не предоставляет встроенный функционал NULLS FIRST | LAST как Oracle, использование CASE WHEN является универсальным инструментом для создания пользовательских последовательностей сортировки.

Важность контекста данных

Выбирая между CASE и ISNULL, учитывайте контекст данных: их уникальность, целостность и лучшие практики наименования.

Полезные материалы

  1. SQL Server: ORDER BY Clause — Подробности использования команды ORDER BY для SQL Server.
  2. CASE (Transact-SQL) – SQL Server — Официальное руководство Microsoft по работе с CASE.
  3. Automating Transaction Log Backups for All SQL Server Databases — Подробности автоматизации резервного копирования в SQL Server.
  4. Order By Clause With NULL Values In SQL Server — Работа с NULL значениями в SQL Server в контексте сортировки.