У меня есть база данных 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