Подтвердить что ты не робот

SQL Server эквивалентен Oracle NULLS FIRST?

Итак, у 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

Любые другие?

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • 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: по умолчанию он работает нормально

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

Если вы проверите Документы MSDN ДОКУМЕНТА ORDER BY (Transact-SQL) и прокрутите вниз до ASC | DESC, вы можете прочитать это:

ASC | DESC

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

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

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

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

Ответ 3

Использовать оператор Case/When, например:

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

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

Порядок по IsNull (Date_Sent, '17530101') desc

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

Ответ 5

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

SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
FROM TableName
ORDER BY ValueIsNull DESC, Value1 

Ответ 6

ORDER BY
  COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
 ,OTHER_FIELDS

Ответ 7

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

ORDER BY -CAST(date_sent as int) ASC

Ответ 8

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

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