ORDER BY DATE, показывающий NULLS сначала, а затем самые последние даты
У меня есть хранимая процедура, которая выполняет оператор выбора. Я хотел бы, чтобы мои результаты упорядочивались по полю даты и отображали сначала все записи с NULL-датами, а затем самые последние даты.
Заявление выглядит так:
SELECT a,b,c,[Submission Date]
FROM someView
ORDER BY [Submission Date] ASC
Теперь сначала будут отображаться все записи с NULL-датами отправки, но когда я доберусь до строк, в которых есть значения даты, они не являются самыми последними датами в представлении.
Если я заменю ASC на DESC, я получу даты в нужном мне порядке, но значения NULL будут в нижней части моего набора результатов.
Есть ли способ структурировать мой запрос так, чтобы я мог отображать нулевые значения в верхней части, а затем, когда есть значения даты, упорядочивать их по убыванию от последних к старым?
Ответы
Ответ 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, которые являются нулевыми, и порядок получается правильно.