it-swarm.com.ru

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

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

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

266
David Božjak
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
359
RedFilter

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

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

В стандартном 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
144
a_horse_with_no_name

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

ORDER BY date IS NULL, date DESC

как найдено на https://stackoverflow.com/a/7055259/496209

32
Luksurious
order by coalesce(date-time-field,large date in future)
14
Gratzy

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

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

13
Majdi M. Aburahelah

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

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

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

result showing sorted by DepartmentId with nulls last

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

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

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

result showing sorted by LastName with nulls last

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

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

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

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

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

9
infogulch

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

select *
from table
order by -rank desc
6
Luizgrs
SELECT *          
FROM Employees
ORDER BY ISNULL(DepartmentId, 99999);

Смотрите это сообщение в блоге .

4
user3923117

В 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

3
Joaquinglezsantos

Спасибо RedFilter за предоставленное отличное решение проблемы с ошибками сортировки обнуляемого поля даты и времени.

Я использую базу данных 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.

3
Kasim Husaini
order by -cast([nativeDateModify] as bigint) desc
1
paparazzo

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

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)  
1
Adam111p

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

заказ

Когда вы упорядочиваете поле, которое может содержать значения 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;
--                                         ^^^^
0
3limin4t0r

ИСПОЛЬЗОВАТЬ функцию NVL

  select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY'))

Вот альтернатива NVL в самой известной СУБД

0
Charmi