TSQL ORDER BY с нулями сначала или последним (внизу или сверху)

У меня есть столбец даты, у которого есть NULL. Я хочу заказать по столбцу даты ASC, но мне нужно, чтобы NULL был внизу. Как это сделать на TSQL?

Ответ 1

В стандартном SQL вы можете указать, куда положить nulls:

order by col asc nulls first
order by col asc nulls last
order by col desc nulls first
order by col desc nulls last

но T-SQL не соответствует стандарту здесь. Порядок NULL зависит от того, сортируете ли вы восходящий или нисходящий в T-SQL:

order by col asc -- implies nulls first
order by col desc -- implies nulls last

С целыми числами вы можете просто сортировать по негативам:

order by -col asc -- sorts by +col desc, implies nulls first
order by -col desc -- sorts by +col asc, implies nulls last

Но это невозможно с датами (или строками, если на то пошло), поэтому вы должны сначала отсортировать по null или не null, а только по столбцу:

order by case when col is null then 1 else 2 end, col asc|desc -- i.e. nulls first
order by case when col is null then 2 else 1 end, col asc|desc -- i.e. nulls last

Ответ 2

Select *
 From  YourTable
 Order By case when DateCol is null then 0 else 1 end
         ,DateCol

Или даже Order By IsNull(DateCol,'2525-12-31')

Ответ 3

order by case when col_name is null then 1 else 2 end, col_name asc добился успеха в Oracle. Однако то же самое на MS SQL Server сдвигает NULL-записи вниз, оставляя ненулевое значение в верхней части результирующего набора.