SQL, как сделать нулевые значения, при последней сортировке по возрастанию

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

Есть ли простой способ сделать это?

Ответ 1

select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate

Ответ 2

( "бит" опоздал, но об этом вообще не упоминалось)

Вы не указали свою СУБД.

В стандартном SQL (и в большинстве современных СУБД, таких как Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB и H2) вы можете указать NULLS LAST или NULLS FIRST:

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

select *
from some_table
order by some_column DESC NULLS LAST

Ответ 3

Я также просто наткнулся на это, и следующее, похоже, делает трюк для меня, на MySQL и PostgreSQL:

ORDER BY date IS NULL, date DESC

как показано на fooobar.com/questions/31276/...

Ответ 4

order by coalesce(date-time-field,large date in future)

Ответ 5

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

select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;

Ответ 6

Если ваш движок позволяет использовать ORDER BY x IS NULL, x или ORDER BY x NULLS LAST. Но если это не помогло:

Если вы сортируете по цифровому типу, вы можете сделать это: (Заимствование схемы из другого ответа.)

SELECT *          
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;

результат, показывая отсортированный по Департаменту с нулями последний

Любое ненулевое число становится 0, а nulls становятся 1, что сортирует нулевые значения.

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

SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName

результат показывается отсортированным по LastName с нулевым последним

Потому что 'a' > ''.

Это даже работает с датами, принуждая к nullable int и используя метод для ints выше:

SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate

(Делает вид, что схема имеет HireDate.)

Эти методы позволяют избежать проблемы с необходимостью придумать "максимальное" значение каждого типа или исправлять запросы, если тип данных (и максимум) изменится (обе проблемы, которые возникают в других решениях ISNULL). Плюс они намного короче, чем CASE.

Ответ 7

Когда ваш столбец порядка является числовым (например, ранг), вы можете умножить его на -1 и затем упорядочить по убыванию. Он сохранит порядок, который вы выберете, но поместите NULL последним.

select *
from table
order by -rank desc

Ответ 9

Спасибо RedFilter за отличное решение проблемы с ошибкой сортировки поля Natable datetime.

Я использую базу данных SQL Server для своего проекта.

Изменение нулевого значения datetime до '1' решает проблему сортировки для столбца типа данных datetime. Однако, если у нас есть столбец с другим типом данных datetime, тогда он не справляется.

Чтобы обрабатывать сортировку столбца varchar, я попытался использовать "ZZZZZZZ", поскольку я знал, что в столбце нет значений, начинающихся с "Z". Он работал, как ожидалось.

В тех же строках я использовал максимальные значения +1 для int и других типов данных, чтобы получить сортировку, как ожидалось. Это также дало мне результаты, которые были необходимы.

Тем не менее, всегда было бы идеальным получить что-то проще в самом ядре базы данных, которое могло бы сделать что-то вроде:

Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

Как упоминалось в ответе, предоставленном a_horse_with_no_name.

Ответ 10

В Oracle вы можете использовать NULLS FIRST или NULLS LAST: указывает, что значения NULL должны быть возвращены до/после значений, отличных от NULL:

ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }

Например:

ORDER BY date DESC NULLS LAST

Ссылка: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html

Ответ 11

order by -cast([nativeDateModify] as bigint) desc

Ответ 12

Решение, использующее "случай", является универсальным, но не использует индексы.

order by case when MyDate is null then 1 else 0 end, MyDate

В моем случае мне нужна была производительность.

 SELECT smoneCol1,someCol2  
 FROM someSch.someTab
 WHERE someCol2 = 2101 and ( someCol1 IS NULL ) 
  UNION   
 SELECT smoneCol1,someCol2
 FROM someSch.someTab
 WHERE someCol2 = 2101 and (  someCol1 IS NOT NULL)  

Ответ 14

Если вы используете MariaDB, они упоминают следующее в документации NULL Values.

заказ

Когда вы упорядочиваете поле, которое может содержать значения NULL, любые значения NULL считаются самыми низкими. Таким образом, при заказе в порядке DESC NULL будут появляться последними. Чтобы заставить NULL считаться самыми высокими значениями, можно добавить еще один столбец, который имеет более высокое значение, когда основным полем является NULL. Пример:

SELECT col1 FROM tab ORDER BY ISNULL(col1), col1;

По убыванию, сначала с NULL:

SELECT col1 FROM tab ORDER BY IF(col1 IS NULL, 0, 1), col1 DESC;

Все значения NULL также считаются эквивалентными для целей предложений DISTINCT и GROUP BY.

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

SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
--                                         ^^^^