Как установить Sqlite3 нечувствительным к регистру при сравнении строк?
Я хочу выбрать записи из базы данных sqlite3 путем сопоставления строк. Но если я использую ' = ' в предложении where, я обнаружил, что sqlite3 чувствителен к регистру. Может кто-нибудь сказать мне, как использовать строку сравнения без учета регистра?
10 ответов:
можно использовать
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
вы можете сделать это так:
SELECT * FROM ... WHERE name LIKE 'someone'(не the решение, но в некоторых случаях очень удобно)
" The как оператор делает шаблон соответствующее сравнение. Операнд к право содержит картину, левый операнд содержит строку чтобы соответствовать шаблону. Один символ процента ("%") в шаблоне соответствует любой последовательности из нуля или более символы в строке. Один подчеркивание ( " _ " ) в узор соответствует любому одиночному символу в строка. любой другой символ соответствует сам или его нижний/верхний регистр эквивалент (т. е. без учета регистра согласования). (Ошибка: только SQLite понимает, верхний/нижний регистр для ASCII письмена. Подобный оператор случай чувствительный для символов Юникода, которые находятся за пределами диапазона ASCII. Для например, выражение ' a 'LIKE ' A' это правда, но ' æ ' как ' Æ ' есть ЛОЖНЫЙ.)."
Это не относится к SQLite, но вы можете просто сделать
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
другой вариант-создать свои собственные параметры сортировки. Затем вы можете установить эти параметры сортировки в столбце или добавить их в предложения select. Он будет использоваться для упорядочения и сравнения.
Это может быть использовано, чтобы сделать "вуаля", как "вуаля".
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
упорядоченной функция должна возвращать целое число, которое является отрицательным, нулевым или положительным, если первая строка меньше, равно или больше второго соответственно.
другой вариант, который может иметь или не иметь смысла в вашем случае, на самом деле иметь отдельный столбец с предварительно пониженными значениями существующего столбца. Это может быть заполнено с помощью функции SQLite
LOWER(), и вы можете выполнить сопоставление в этом столбце вместо этого.очевидно, что это добавляет избыточность и потенциал для несогласованности, но если ваши данные статичны, это может быть подходящим вариантом.
Если столбец имеет тип
charзатем вам нужно добавить значение, которое вы запрашиваете с пробелами, пожалуйста, обратитесь к этому вопросу здесь . Это в дополнение к использованиюCOLLATE NOCASEили одно из других решений (верхний () и т. д.).
вы можете использовать запрос like для сравнения соответствующей строки с таблицей vales.
выберите имя столбца из table_name, где имя столбца, как "соответствующее значение сравнения";
просто, вы можете использовать COLLATE NOCASE в своем запросе SELECT:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Comments