SQL Server эквивалентен Oracle NULLS FIRST? - PullRequest
45 голосов
/ 22 сентября 2009

Итак, у Oracle NULLS FIRST, который я могу использовать для сортировки пустых значений вверху, а затем для моего столбца в порядке убывания:

ORDER BY date_sent NULLS FIRST

Что сопоставимо в SQL Server? Есть эти альтернативы, если предположить, что значения даты равны NULL или в прошлом:

ORDER BY ISNULL(date_sent, GETDATE()) DESC
ORDER BY (CASE WHEN t.setinactive IS NULL THEN 1 ELSE 2 END), t.setinactive DESC
ORDER BY -CAST(date_sent as int) ASC

Кто-нибудь еще?

Ответы [ 8 ]

65 голосов
/ 22 сентября 2009

Вы можете сделать трюк:

ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order] 
12 голосов
/ 22 января 2015

Быстрый ответ таков: лучшим решением для изменения порядка нуля в необходимых случаях является принятое. Но вам нужно только использовать его или его вариант в необходимых случаях:

  • DESC + NULLS FIRST:

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

  • ASC + NULLS LAST:

    ORDER BY (CASE WHEN [Order] IS NULL THEN 1 ELSE 0 END), [Order] ASC

  • ASC + NULLS FIRST: по умолчанию работает нормально

  • DESC + NULLS LAST: по умолчанию работает нормально

Посмотрим, почему:

Если вы проверите документ ORDER BY (Transact-SQL) MSDN docs и прокрутите вниз до ASC | DESC, вы можете прочитать это:

ASC | DESC

Указывает, что значения в указанном столбце должны быть отсортированы в порядке возрастания или убывания. ASC сортирует от самого низкого значения до самого высокого значения. DESC сортирует от самого высокого значения до самого низкого значения. ASC - это порядок сортировки по умолчанию. Нулевые значения рассматриваются как минимально возможные значения.

Таким образом, по умолчанию, если вы укажете порядок ASC, он будет работать как NULLS FIRST. И, если вы укажете DESC, он будет работать как NULLS LAST.

Так что вам нужно только изменить поведение для NULLS FIRST в DESC порядке и для NULLS LAST в ASC порядке.

ИМХО, лучшее решение для изменения порядка нулей в необходимых случаях - это принятое, но я включил его, адаптированный к различным случаям, в начале моего ответа.

5 голосов
/ 22 сентября 2009

Пример использования / когда, например:

ORDER BY (case WHEN ColINT IS NULL THEN {maxIntValue} ELSE ColINT END) DESC

ORDER BY (case WHEN ColVChar IS NULL THEN {maxVCharValue} ELSE ColVChar END) DESC

ORDER BY (case WHEN ColDateT IS NULL THEN {maxDateTValue} ELSE ColDateT END) DESC

... и т. Д.

или даже лучше, так как вам все равно, какой у вас тип столбца и максимальное значение.

ORDER BY (case WHEN ColAnyType IS NULL THEN 1 ELSE 0 END) DESC, ColAnyType DESC
4 голосов
/ 12 ноября 2010

Простой пример:

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
FROM TableName
ORDER BY ValueIsNull DESC, Value1 
4 голосов
/ 22 сентября 2009

Если в вашей таблице есть строки с датами меньше, чем сейчас, а другие строки с датами больше, чем сейчас, ваши NULLS появятся в середине списка. Вместо этого вам, вероятно, следует использовать значение, которое никогда не будет сортироваться в середине списка.

Заказ по IsNull (Date_Sent, '17530101') desc

Примечание: эта дата на самом деле 1 января 1753 года.

3 голосов
/ 22 сентября 2009

Это альтернативный способ, когда вы хотите настроить отображение пустых значений в порядке сортировки. Отмените столбец и измените порядок сортировки. К сожалению, вам нужно будет CAST dateTime столбцы.

ORDER BY -CAST(date_sent as int) ASC
3 голосов
/ 22 сентября 2009
ORDER BY
  COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
 ,OTHER_FIELDS
1 голос
/ 22 сентября 2009

Насколько я знаю, вы не можете это контролировать. И похоже, у вас есть правильный подход с ISNULL.

Для строк я использовал ISNULL(field, '') для той же цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...