Как сделать 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)
- Добавьте поддержку синтаксиса 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)
для достижения этой цели.