Я хочу выбрать записи из базы данных sqlite3 путем сопоставления строк. Но если я использую '=' в предложении where, я обнаружу, что sqlite3 чувствителен к регистру. Может кто-нибудь сказать мне, как использовать сравнение строк без учета регистра?
Я хочу выбрать записи из базы данных sqlite3 путем сопоставления строк. Но если я использую '=' в предложении where, я обнаружу, что sqlite3 чувствителен к регистру. Может кто-нибудь сказать мне, как использовать сравнение строк без учета регистра?
Вы можете использовать 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
Оптимизатор также может использовать индекс для поиска и сопоставления без учета регистра в столбце. Вы можете проверить это с помощью команды SQL explain
, e. г. :
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
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Вы можете сделать это так:
SELECT * FROM ... WHERE name LIKE 'someone'
(Это не решение , но в некоторых случаях очень удобно)
"Оператор LIKE делает шаблон сопоставление сравнения. Операнд для право содержит образец, левый операнд содержит строку чтобы соответствовать шаблону. символ процента ("%") в шаблоне соответствует любой последовательности от нуля или более символы в строке. подчеркивание ("_") в шаблоне соответствует любому отдельному символу в строка. Любой другой символ соответствует Сам или его нижний / верхний регистр эквивалент (т.е. е. без учета регистра соответствия) . (Ошибка: только SQLite понимает верхний / нижний регистр для ASCII персонажи. Оператор LIKE - это случай чувствителен к символам юникода, которые находятся за пределами диапазона ASCII. За Например, выражение 'a' LIKE 'A' TRUE, но '' 'LIKE' Æ '- FALSE. ). "
Это не относится к sqlite, но вы можете просто сделать
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
Еще один вариант - создать свой собственный порядок сортировки. Затем вы можете установить это сопоставление в столбце или добавить его в выбранные предложения. Он будет использоваться для упорядочивания и сравнения.
Это можно использовать, чтобы сделать VOILA LIKE voilà.
http: // www. SQLite. орг / capi3ref. html # sqlite3_create_collation
Функция сортировки должна возвращать целое число, которое является отрицательным, нулевым или положительным, если первая строка меньше, равна или больше второй, соответственно.
Другой вариант, который может иметь или не иметь смысла в вашем случае, - это фактически иметь отдельный столбец с предварительно заниженными значениями существующего столбца. Это можно заполнить с помощью функции SQLite LOWER()
, и вы можете вместо этого выполнить сопоставление для этого столбца.
Очевидно, что это добавляет избыточность и возможность несогласованности, но если ваши данные статичны, это может быть подходящим вариантом.
Просто, вы можете использовать COLLATE NOCASE в вашем запросе SELECT:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
вы можете использовать аналогичный запрос для сравнения соответствующей строки с табличными значениями.
выбрать имя столбца из table_name, где имя столбца, как «соответствующее значение сравнения»;
Если столбец имеет тип char
, то вам необходимо добавить значение, которое вы запрашиваете с пробелами, пожалуйста, обратитесь к этому вопросу здесь . Это в дополнение к использованию COLLATE NOCASE
или одного из других решений (upper () и т. Д.).
Это работает для меня отлично. SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE