У меня есть таблица SQL с полем datetime. Поле, о котором идет речь, может быть нулевым. У меня есть запрос, и я хочу, чтобы результаты сортировались по возрастанию по полю datetime, однако я хочу строки, в которых поле datetime равно нулю в конце списка, а не в начале.
Есть ли простой способ сделать это?
sql
sorting
sql-order-by
Давид Божьяк
источник
источник
Ответы:
источник
order by case when MyDate is null then 1 else 0 end
это очень длинный способ сказатьORDER BY MyDate IS NULL
order by 0
интерпретируется как индекс столбца, а индексы столбца основаны на 1. Чтобы отсортировать запрос по 3-му столбцу, можно сказатьorder by 3
(что является ужасной идеей для рабочих запросов), но очень удобно (как есть*
) при экспериментах.(«Немного» поздно, но об этом вообще не упоминалось)
Вы не указали свою СУБД.
В стандартном SQL (и в большинстве современных СУБД, таких как Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB и H2) вы можете указать
NULLS LAST
илиNULLS FIRST
:Используйте,
NULLS LAST
чтобы отсортировать их до конца:источник
NULLS FIRST
иNULLS LAST
были добавлены в SQL: 2003, но в разных DMBS нет стандартной реализации. В зависимости от механизма базы данных используйтеORDER BY expr some_column DESC NULLS LAST
(Oracle),ORDER BY ISNULL(some_column, 1), some_column ASC
(MSSQL) илиORDER BY ISNULL(some_column), some_column ASC
(MySQL с другой реализацией ISNULL ()).ASC
/DESC
с нулями, некоторые делают. Таким образом, единственный способ обеспечить это - использовать,NULL FIRST/LAST
если СУБД поддерживает это. У него документы, что вы намерены. Использованиеisnull()
или других функций - это обходной путь для отсутствующей поддержкиNULLS FIRST/LAST
(которая поддерживается Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB и H2)expr
ключевое слово при использовании NULLS FIRST / LAST. И спасибо за то, что значения null показываются первыми / последними в зависимости от типа базы данных, не знал этого!NULLS LAST
не работал в моей базе данных MySQL.Я также наткнулся на это, и следующее, похоже, помогает мне в MySQL и PostgreSQL:
как найдено на https://stackoverflow.com/a/7055259/496209
источник
IS NULL
иIS NOT NULL
не сделал работу в моей базе данных MySQL.источник
Вы можете использовать встроенную функцию для проверки на ноль или не ноль, как показано ниже. Я проверяю его и он работает нормально.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
источник
ISNULL(MyDate) DESC, MyDate ASC
, но это не сортировать в правильном порядке.Если ваш двигатель позволяет
ORDER BY x IS NULL, x
илиORDER BY x NULLS LAST
использовать это. Но если это не так, это может помочь:Если вы сортируете по числовому типу, вы можете сделать это: (Заимствование схемы из другого ответа .)
Любое ненулевое число становится 0, а нули становятся 1, что означает, что сортировка нуля выполняется в последнюю очередь.
Вы также можете сделать это для строк:
Потому что
'a'
>''
.Это даже работает с датами, приводя к обнуляемому int и используя метод для целых чисел выше:
(Давайте представим, что схема имеет HireDate.)
Эти методы позволяют избежать необходимости придумывать или управлять «максимальным» значением каждого типа или исправлять запросы, если тип данных (и максимальный) изменяется (обе проблемы, с которыми сталкиваются другие решения ISNULL). Плюс они намного короче чем ДЕЛО.
источник
Когда ваш столбец заказа числовой (например, ранг), вы можете умножить его на -1, а затем заказать по убыванию. Это сохранит порядок, который вы ожидаете, но поставьте NULL последним.
источник
Смотрите этот пост в блоге .
источник
Спасибо RedFilter за отличное решение проблемы с ошибками сортировки поля datetime.
Я использую базу данных SQL Server для своего проекта.
Изменение нулевого значения datetime на '1' решает проблему сортировки для столбца типа данных datetime. Однако если у нас есть столбец с типом данных, отличным от datetime, он не может быть обработан.
Чтобы обработать сортировку столбцов varchar, я попытался использовать 'ZZZZZZZ', так как знал, что столбец не имеет значений, начинающихся с 'Z'. Это сработало, как и ожидалось.
В тех же строках я использовал максимальные значения +1 для int и других типов данных, чтобы получить сортировку, как и ожидалось. Это также дало мне результаты, которые были необходимы.
Тем не менее, всегда было бы идеально получить что-то более простое в самом движке базы данных, которое могло бы сделать что-то вроде:
Как указано в ответе, предоставленном a_horse_with_no_name.
источник
В Oracle вы можете использовать
NULLS FIRST
илиNULLS LAST
: указывает, что значения NULL должны возвращаться до / после значений, отличных от NULL:Например:
Ссылка: http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html
источник
Если вы используете MariaDB, они упоминают следующее в документации NULL Values .
Выше показаны два способа упорядочения по значениям NULL, вы также можете комбинировать их с ключевыми словами ASC и DESC. Например, другой способ сначала получить значения NULL:
источник
Решение с использованием «case» является универсальным, но тогда не используйте индексы.
В моем случае мне нужна производительность.
источник
UNION ALL
.ИСПОЛЬЗОВАТЬ функцию NVL
Вот альтернатива NVL в самых известных СУБД
источник
источник