Почему при наличии значения NULL в столбце и упорядочении по возрастанию значения NULL сортируются первыми?
select 1 as test
union all
select 2
union all
select NULL
union all
select 3
union all
select 4
order by test
результаты в
NULL
1
2
3
4
Я продолжаю думать, что NULL означает «неопределенный» или возможный «неизвестный». Если это правда, не будут ли они сортировать в последнюю очередь, так как значение может быть больше, чем все другие значения? (Или это где-то вариант сортировки?)
Я использую SQL Server 2008R2, но подозреваю, что это верно для всех SQL-серверов и, вероятно, для всех СУБД.
sql-server
database-theory
sorting
Ричард
источник
источник
desc
порядок, чтобы показать самые большие или самые последние вещи, и в этом случае я был бы рад, чтобы нулевые вещи были последними.Ответы:
NULL означает неизвестный. Никакая другая интерпретация не действительна.
Там не может быть . Там нет потенциальной ценности. Неизвестный неизвестный неизвестный.
Что касается того, почему оно появляется первым, а не последним, то это не учитывается опубликованными стандартами SQL и, к сожалению, остается на усмотрение поставщика СУБД:
источник
Вы правы, что
NULL
может означать «Неопределенный» или «Uknownn» или «Пока неизвестно» или «Не применяется». Но нет никаких оснований ставить Нули первым или последним. Если мы не знаем фактические значения, то они могут быть маленькими или большими.Я думаю, что стандарт для определения желаемого поведения Nulls во время сортировки:
К сожалению, SQL-сервер еще не принял этот синтаксис. Если я не ошибаюсь, у PostgreSQL и Oracle это есть.
Одно из решений:
Другое решение, которое нуждается в корректировке в зависимости от типа данных - но не будет хорошо сформовано, так как не может использовать индекс для
(test)
:источник
Я не знаю, почему это так, но по определению NULLS нельзя сравнивать с ненулевыми значениями, поэтому они должны идти либо в начале, либо в конце (ответ Марка описывает это гораздо подробнее).
Чтобы получить поведение, которое вы хотите - Насколько я знаю, нет никакой возможности сортировки, чтобы поставить нулевые значения последними, поэтому вы должны связать их с помощью вычисляемого столбца, чтобы заставить их последними. Однако в SQL Server вы не можете упорядочить по вычисляемому столбцу (
CASE WHEN ...
), когда ваши данные содержат оператор set (UNION ALL
). Так:Будет работать для сортировки нулей в прошлом. Если вам нужно использовать
UNION
(илиEXCEPT
илиINTERSECTS
) для создания набора данных, поместите данные во временную таблицу, как указано выше.источник
Если вы имеете дело с номерами, вы также можете использовать
NULL
являются минимально возможными значениями, поэтомуDESC
ставит их в конце. Между тем ненулевые значения имеют инвертированный знак, так что наDESC
самом деле этоASC
реальные значения. Это должно быть быстрее,CASE
и я полагаю, что оптимизатор запросов может также использовать индексы дляtest
столбцов.источник
(- test)
.