Подтвердить что ты не робот

ORDER BY DATE, показывающий NULLS сначала, а затем самые последние даты

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

Заявление выглядит так:

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC

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

Если я заменю ASC на DESC, я получу даты в нужном мне порядке, но значения NULL будут в нижней части моего набора результатов.

Есть ли способ структурировать мой запрос так, чтобы я мог отображать нулевые значения в верхней части, а затем, когда есть значения даты, упорядочивать их по убыванию от последних к старым?

4b9b3361

Ответ 1

@Крис, у вас его почти нет.

ORDER BY (CASE WHEN [Submission Date] IS NULL THEN 1 ELSE 0 END) DESC, 
         [Submission Date] DESC

[Edit: #Eppz попросил меня изменить код выше, как показано на рисунке]

Я лично предпочитаю это намного лучше, чем создание "волшебных чисел". Магические числа почти всегда являются проблемой, ожидающей, что это произойдет.

Ответ 2

Вы можете сделать что-то вроде этого, помещая NULL внизу:

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC

Ответ 3

Стандартный SQL (ISO/IEC 9075-2: 2003 или более поздний - 2008) предусматривает:

ORDER BY SomeColumn NULLS FIRST

Большинство СУБД на самом деле не поддерживают это, AFAIK.

Ответ 4

попробовать

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC

Ответ 5

OrderBy="ColumnName = NULL desc, ColumnName desc"

Ответ 6

попробуйте это

SELECT a, b, c, [Дата отправки] ИЗ someView СОРТИРОВАТЬ ПО isnull ([Дата представления], литье ('1770/01/01' в качестве даты и времени)) ASC

Ответ 7

Я знаю, что это устарело, но когда я нашел его, я заметил, что принятое решение fooobar.com/questions/111107/... можно упростить, сделав результат выражения 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

Ответ 8

У меня есть еще одно предложение, которое может быть проще, чем все остальные:

Для SQL Server большинство параметров не работают, кроме случаев.

Я обнаружил, что это на самом деле прекрасно работает для меня: ЗАКАЗАТЬ ПО ISNULL (Submission_Date, GETDATE()) DESC

В бите порядка запроса я назначаю значение GETDATE() значениям Submittion_Date, которые являются нулевыми, и порядок получается правильно.