ORDER BY DATE сначала показывает NULL, затем самые последние даты - PullRequest
57 голосов
/ 05 мая 2009

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

Утверждение выглядит так:

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

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

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

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

Ответы [ 7 ]

99 голосов
/ 05 мая 2009

@ Крис, у тебя почти это есть.

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

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

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

25 голосов
/ 05 мая 2009

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

ORDER BY [Submission Date] IS NULL DESC, [Submission Date] ASC
17 голосов
/ 05 мая 2009

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

ORDER BY SomeColumn NULLS FIRST

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

3 голосов
/ 05 мая 2009

1001 * попробовать *

SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY isnull([Submission Date],cast('2079/01/01' as datetime)) ASC
1 голос
/ 28 июня 2015
OrderBy="ColumnName = NULL desc, ColumnName desc"
0 голосов
/ 18 ноября 2016

Я знаю, что это старое, но когда я нашел его, я заметил, что принятое решение https://stackoverflow.com/a/821856/7177892, можно упростить, если сделать результат оператора 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
0 голосов
/ 05 мая 2009

попробуйте

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

...