Ответ 1
Вы можете сделать трюк:
ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order]
Итак, у 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
Любые другие?
Вы можете сделать трюк:
ORDER BY (CASE WHEN [Order] IS NULL THEN 0 ELSE 1 END), [Order]
Быстрый ответ таков: наилучшим решением для изменения порядка нулей в необходимых случаях является принятое. Но вам нужно использовать его или его вариацию в необходимых случаях:
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, наилучшим решением для изменения порядка нулей в необходимых случаях является принятое, но я включил его в разные случаи в начале моего ответа.
Использовать оператор 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
Если у вас есть строки в таблице с датами меньше, чем сейчас, а другие строки с датами больше, чем сейчас, ваши NULLS будут отображаться в середине списка. Вместо этого вы, вероятно, должны использовать значение, которое никогда не будет сортироваться в середине вашего списка.
Порядок по IsNull (Date_Sent, '17530101') desc
Примечание. Эта дата на самом деле 1 января 1753 года.
Простой пример:
SELECT (CASE WHEN Value1 IS NULL THEN 1 ELSE 0 END) AS ValueIsNull, Value1, Value2, Value3
FROM TableName
ORDER BY ValueIsNull DESC, Value1
ORDER BY
COALESCE(POSTING_DATE,'1900-01-01 00:00:00.000')
,OTHER_FIELDS
Это альтернативный способ, когда вы хотите настроить способ отображения нулей в порядке сортировки. Отмените столбец и отмените порядок сортировки. К сожалению, вам понадобятся столбцы CAST dateTime.
ORDER BY -CAST(date_sent as int) ASC
Вы не можете контролировать это, насколько мне известно. И похоже, что у вас есть правильный подход с ISNULL
.
С помощью строк я использовал ISNULL(field, '')
для этой же цели.