Как сделать NULLS LAST в SQLite?

Я хотел бы отсортировать мой результат со всеми столбцами NULL last (NULLS LAST), как указано в расширении SQL: 2003 T611, К сожалению, SQLite, похоже, не поддерживает его. Есть ли уловка?

Ответы

Ответ 1

Может ли это работать?

SELECT ....... ORDER BY COALESCE(col1,col2,col3,etc) IS NULL

Я немного смущен вашей формулировкой "все столбцы NULL последние". Если вы хотите, чтобы все значения NULL сохранялись в определенном столбце, используйте это:

SELECT ....... ORDER BY col1 IS NULL

Ответ 2

Хотя мне немного нравится ответ Blorgbeard, этот вариант не заботится о предоставлении действительного "поддельного" значения правильного типа данных.

ORDER BY CASE WHEN SOMECOL IS NULL THEN 1 ELSE 0 END, SOMECOL

В качестве альтернативы, даже если вы хотите использовать поддельное значение, я бы предпочел IFNULL !

ORDER BY IFNULL(SOMECOL,-9999)

Как отметил Майкл, SQLite использует IFNULL. Вы также можете использовать универсальную версию ANSI-SQL COALESCE.

Ответ 3

Вы можете сделать что-то подобное, чтобы подделать его:

select * from test
order by case ordercol when null then 1 else 0 end, ordercol 

Ответ 4

Я столкнулся с той же проблемой. Я узнал, что это может сработать:

(я не нашел никакой функции isnull для SQLite)

order by ifnull(column_what_you_want_to_sort,'value in case of null')

Ответ 5

SQLite 3.30. 0+ поддерживает предложения NULLS FIRST/LAST.

Release History (v3.30.0 - 2019-10-04)

  1. Добавьте поддержку синтаксиса NULLS FIRST и NULLS LAST в предложениях ORDER BY.

ORDER BY

SQLite считает значения NULL меньшими, чем любые другие значения для целей сортировки. Следовательно, значения NULL естественным образом появляются в начале порядка ASC и в конце порядка DESC. Это можно изменить с помощью синтаксиса "ASC NULLS LAST" или "DESC NULLS FIRST".

Ответ 6

Мое решение состояло в том, чтобы изменить диапазон моего priority столбца и использовать order by desc (сортировка по убыванию). Это ставит нули в конце за один раз.

Понятно, что это работает, только если вы управляете своим столбцом упорядочения priority, но это здорово, если вы можете использовать его!

Если это не сработало, я обнаружил, что объединенный запрос сработал. Просто union два запроса и добавьте ограничение, where not null в первом и where null во втором. Второй запрос будет в конце первого.

Ответ 7

В моем случае я хотел сначала отсортировать по убыванию с NULL столбцами. Я добавляю записи в список из цикла while после запроса, поэтому я просто проверил, равен ли столбец NULL, и использовал ArrayList.add(0, Object) для достижения этой цели.