ПОРЯДОК ПО ДАТЕ, показывающий сначала НУЛИ, затем самые последние даты

StackOverflow https://stackoverflow.com/questions/821798

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Теперь сначала будут отображены все записи с НУЛЕВЫМИ датами отправки, но когда я доберусь до строк, в которых есть значения даты, они не будут самыми последними датами в представлении.

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

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

Это было полезно?

Решение

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

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

[Редактировать: #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 ([Дата представления], приведение («1770/01/01» как дата / время)) 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top