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
OrderBy="ColumnName = NULL desc, ColumnName 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

Другие вопросы по тегам