Какое максимальное значение для порядка STRING в SQL (SQLite)? - PullRequest
0 голосов
/ 12 января 2020

У меня есть база данных SQLite, и я хочу упорядочить результаты по возрастанию столбца String (name). Я хочу, чтобы null -значные строки были последними в порядке возрастания.

Более того, я делаю некоторую фильтрацию для того же столбца (WHERE name>"previously obtained value"), которая отфильтровывает NULL -значные строки, чего я не хочу. Кроме того, версия SQLite, которую я использую (я не могу это контролировать), не поддерживает NULLS LAST. Поэтому для простоты я хочу использовать IFNULL(name,"Something") в моем ORDER BY и моем сравнении.

Я хочу, чтобы этот "Something" был максимально большим, чтобы мои null -значные строки всегда в прошлом. У меня есть тексты на японском и корейском языках, поэтому я не могу просто использовать "ZZZ".

Поэтому я вижу два возможных решения. Во-первых, используйте «максимальный» символ, используемый SQLite в порядке расположения строк по умолчанию. Знаете ли вы, что это за значение или как его получить? Во-вторых, поскольку ячейки могут содержать любой тип в SQLite, есть ли значение любого другого типа, которое всегда будет считаться большим, чем любая строка?

Пример:

+----+-----------------+---------------+
| id |      name       |   othercol    |
+----+-----------------+---------------+
|  1 |    English name | hello         |
|  2 |    NULL         | hi            |
|  3 |    NULL         | hi hello      |
|  4 |    暴鬼          | hola          |
|  5 |    NULL         | bonjour hello |
|  6 |    아바키        | hello bye     |
+----+-----------------+---------------+

Текущий запрос: SELECT * FROM mytable WHERE othercol LIKE "hello" AND (name,id)>("English name",1) ORDER BY (name,id)

Результат (по идентификаторам): 6

Проблемы: имена NULL отфильтровываются из-за сравнения, а когда у меня нет сравнения, они показываются первыми .

То, что я думаю, решило бы эти проблемы: SELECT * FROM mytable WHERE othercol LIKE "hello" AND (IFNULL(name,"Something"),id)>("English name",1) ORDER BY (IFNULL(name,"Something"),id)

Но мне нужно, чтобы "Something" был больше, чем любая строка, с которой я мог бы столкнуться.

Ожидаемый результат: 6 , 3, 5

Ответы [ 3 ]

4 голосов
/ 12 января 2020

Я думаю, что более простой способ - использовать nulls last:

order by column nulls last

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

2 голосов
/ 12 января 2020

Измените ваше предложение WHERE на:

WHERE SOMECOL > "previously obtained value" OR SOMECOL IS NULL

, чтобы NULL s не отфильтровывались (так как вы этого хотите). Вы можете отсортировать последние NULL s следующим образом:

ORDER BY SOMECOL IS NULL, SOMECOL

Выражение:

SOMECOL IS NULL

оценивается как 1 (True) или 0 (False), поэтому значения, которые не NULL, будут отсортированы первыми. редактировать Если вам нужна строка, которая больше, чем любая name в таблице, вы можете получить ее:

select max(name) || ' ' from mytable

, поэтому в вашем коде используйте:

ifnull(name, (select max(name) || ' ' from mytable)) 
0 голосов
/ 13 января 2020

Наконец-то нашли решение: для любого, кто ищет персонажа больше любого другого (когда я публикую это, таблица юникода может быть расширена), вот ваш парень: CAST(x'f48083bf' AS TEXT).

Пример в мой случай:

SELECT * FROM mytable WHERE othercol LIKE "hello" AND (IFNULL(name,CAST(x'f48083bf' AS TEXT)),id)>("English name",1) ORDER BY (IFNULL(name,CAST(x'f48083bf' AS TEXT)),id)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...