ORDER BY DATE сначала показывает NULL, а затем самые последние даты
У меня есть хранимая процедура, которая выполняет оператор выбора. Я хотел бы, чтобы мои результаты упорядочивались по полю даты и отображали сначала все записи с значениями NULL, а затем самые последние даты.
Утверждение выглядит так:
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC
Теперь при этом сначала будут отображаться все записи с нулевыми датами отправки, но когда я получаю строки, в которых есть значения дат, они не являются самыми последними датами в представлении.
Если я заменю ASC на DESC, то получу даты в нужном мне порядке, но значения NULL будут в нижней части моего набора результатов.
Есть ли способ структурировать мой запрос так, чтобы я мог отображать нулевые значения в верхней части, а затем, когда есть значения даты, упорядочивать их по убыванию от последних к старым?
9 ответов
@ Крис, у тебя почти это есть.
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
[Редактировать: #Eppz попросил меня настроить код выше, как показано в данный момент]
Я лично предпочитаю это намного лучше, чем создавать "магические числа". Магические числа - почти всегда проблема, ожидающая, чтобы случиться.
Вы можете сделать что-то вроде этого, поместив значения NULL внизу:
ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
Стандарт SQL (ISO/IEC 9075-2:2003 или более поздняя версия - 2008) предусматривает:
ORDER BY SomeColumn NULLS FIRST
Большинство СУБД фактически не поддерживают это, AFAIK.
Пытаться
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
Я знаю, что это старое, но когда я нашел его, я заметил, что принятое решение, /questions/9899064/order-by-date-snachala-pokazyivaet-null-a-zatem-samyie-poslednie-datyi/9899088#9899088, можно упростить, сделав так, чтобы результат оператора CASE был либо сегодня (GETDATE()) или фактическая дата.
Оригинал:
ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC,
[Submission Date] DESC
Упрощенная:
ORDER BY (CASE WHEN [Submission Date] IS NULL
THEN GETDATE()
ELSE [Submission Date]
END) DESC
У меня есть еще одно предложение, которое может быть проще, чем все остальные:
Для SQL Server большинство опций не работают, за исключением случая.
Я обнаружил, что это на самом деле прекрасно работает для меня: ORDER BY ISNULL(Submission_Date, GETDATE()) DESC
В бите порядка запроса я назначаю значение GETDATE () значениям Submittion_Date, которые являются нулевыми, и порядок получается правильно.
Предполагая, что дата отправки меньше текущей даты и времени
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY ISNULL([Submission Date], GETDATE()) DESC
Попробуй это
ВЫБЕРИТЕ a,b,c,[Дата отправки] ОТ SomeView ORDER BY isnull([Дата отправки], приведение ("1770/01/01" как дата / время)) ASC