Порядок по дате показывает сначала нули, а затем самые последние даты


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

оператор выглядит так:

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

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

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

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

7 53

7 ответов:

@Крис, У тебя почти получается.

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

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

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

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

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

попробуй такое

выберите a,b, c, [дата отправки] ОТ someView ПО ЗАКАЗУ isnull ([дата представления], cast ('1770/01/01' as datetime)) ASC

Я знаю, что это старый, но когда я нашел его, я заметил принятое решение,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