Ответ 1
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
У меня есть таблица SQL с полем datetime. Поле, о котором идет речь, может быть нулевым. У меня есть запрос, и я хочу, чтобы результаты отсортировались по возрастанию с помощью поля datetime, однако мне нужны строки, в которых поле datetime равно null в конце списка, а не в начале.
Есть ли простой способ сделать это?
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
( "бит" опоздал, но об этом вообще не упоминалось)
Вы не указали свою СУБД.
В стандартном 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
Я также просто наткнулся на это, и следующее, похоже, делает трюк для меня, на MySQL и PostgreSQL:
ORDER BY date IS NULL, date DESC
как показано на fooobar.com/questions/31276/...
order by coalesce(date-time-field,large date in future)
Вы можете использовать встроенную функцию для проверки нулевого или не нулевого значения, как показано ниже. Я тестирую его и прекрасно работаю.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
Если ваш движок позволяет использовать 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
Потому что 'a'
> ''
.
Это даже работает с датами, принуждая к nullable int и используя метод для ints выше:
SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate
(Делает вид, что схема имеет HireDate.)
Эти методы позволяют избежать проблемы с необходимостью придумать "максимальное" значение каждого типа или исправлять запросы, если тип данных (и максимум) изменится (обе проблемы, которые возникают в других решениях ISNULL). Плюс они намного короче, чем CASE.
Когда ваш столбец порядка является числовым (например, ранг), вы можете умножить его на -1 и затем упорядочить по убыванию. Он сохранит порядок, который вы выберете, но поместите NULL последним.
select *
from table
order by -rank desc
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId, 99999);
Смотрите это сообщение в блоге.
Спасибо 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.
В 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
order by -cast([nativeDateModify] as bigint) desc
Решение, использующее "случай", является универсальным, но не использует индексы.
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)
ИСПОЛЬЗОВАТЬ функцию NVL
select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY'))
Если вы используете 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;
-- ^^^^