Я хочу выбрать записи из базы данных sqlite3 путем сопоставления строк. Но если я использую '=' в предложении where, я обнаружил, что sqlite3 чувствителен к регистру. Может ли кто-нибудь сказать мне, как использовать строку сравнения без учета регистра?
Как установить Sqlite3 как нечувствительный к регистру при сравнении строк?
Ответ 1
Вы можете использовать COLLATE NOCASE
в запросе SELECT
:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Дополнительно, в SQLite вы можете указать, что столбец должен быть нечувствителен к регистру при создании таблицы, указав COLLATE NOCASE
в определении столбца (остальные параметры binary
(по умолчанию) и rtrim
; здесь). Вы можете указать COLLATE NOCASE
при создании индекса. Например:
create table Test ( Text_Value text collate nocase ); insert into Test values ('A'); insert into Test values ('b'); insert into Test values ('C'); create index Test_Text_Value_Index on Test (Text_Value collate nocase);
Выражения с участием Test.Text_Value
теперь должны быть нечувствительны к регистру. Например:
sqlite> select Text_Value from Test where Text_Value = 'B'; Text_Value ---------------- b sqlite> select Text_Value from Test order by Text_Value; Text_Value ---------------- A b C sqlite> select Text_Value from Test order by Text_Value desc; Text_Value ---------------- C b A
Оптимизатор также может потенциально использовать индекс для поиска и сопоставления без учета регистра в столбце. Вы можете проверить это, используя команду explain
SQL, например:
sqlite> explain select Text_Value from Test where Text_Value = 'b'; addr opcode p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0 Goto 0 16 1 Integer 0 0 2 OpenRead 1 3 keyinfo(1,NOCASE) 3 SetNumColumns 1 2 4 String8 0 0 b 5 IsNull -1 14 6 MakeRecord 1 0 a 7 MemStore 0 0 8 MoveGe 1 14 9 MemLoad 0 0 10 IdxGE 1 14 + 11 Column 1 0 12 Callback 1 0 13 Next 1 9 14 Close 1 0 15 Halt 0 0 16 Transaction 0 0 17 VerifyCookie 0 4 18 Goto 0 1 19 Noop 0 0
Ответ 2
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Ответ 3
Вы можете сделать это следующим образом:
SELECT * FROM ... WHERE name LIKE 'someone'
(Это не решение, но в некоторых случаях очень удобно)
"Оператор LIKE выполняет шаблон сопоставив сравнение. Операнд для право содержит шаблон, левый операнд содержит строку чтобы соответствовать шаблону. символ процента (" % ") в шаблоне соответствует любой последовательности нуля или более символов в строке. подчеркивание (" _") в шаблоне соответствует любому одиночному символу в строка. Любой другой символ соответствует или нижний/верхний регистр эквивалент (т.е. нечувствительный к регистру соответствие). (Ошибка: только SQLite понимает верхний/нижний регистр для ASCII персонажи. Оператором LIKE является случай чувствительный для символов Юникода, который находятся за пределами диапазона ASCII. Для Например, выражение 'a' LIKE 'A' TRUE, но 'æ' LIKE 'Æ' FALSE.).
Ответ 4
Это не относится к sqlite, но вы можете просто сделать
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
Ответ 5
Здесь вероятное решение для вас
http://www.codeproject.com/KB/database/SQLiteUTF8CIComparison.aspx
Ответ 6
Другой вариант - создать собственную собственную сортировку. Затем вы можете установить эту сортировку в столбце или добавить его в свои предложения. Он будет использоваться для упорядочения и сравнения.
Это можно использовать для создания 'VOILA' LIKE 'voilà'.
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
Функция сортировки должна возвращать целое число, которое отрицательно, равно нулю или положительно, если первая строка меньше, равна или больше второй.
Ответ 7
Другой вариант, который может иметь или не иметь смысла в вашем случае, состоит в том, чтобы фактически иметь отдельный столбец с предварительно пониженными значениями существующего столбца. Это можно заполнить с помощью функции SQLite LOWER()
, и затем вы можете выполнить сопоставление в этом столбце.
Очевидно, что это добавляет избыточность и потенциальную возможность несогласованности, но если ваши данные статичны, это может быть подходящим вариантом.
Ответ 8
Если столбец имеет тип char
, то вам нужно добавить значение, которое вы запрашиваете с пробелами, см. здесь здесь. Это в дополнение к использованию COLLATE NOCASE
или одного из других решений (upper() и т.д.).
Ответ 9
вы можете использовать подобный запрос для сравнения соответствующей строки со значениями таблиц.
выберите имя столбца из table_name, где имя столбца, например "соответствующее сравнительное значение";
Ответ 10
Его работа для меня Прекрасно.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE