Как установить Sqlite3 нечувствительным к регистру при сравнении строк?



Я хочу выбрать записи из базы данных sqlite3 путем сопоставления строк. Но если я использую ' = ' в предложении where, я обнаружил, что sqlite3 чувствителен к регистру. Может кто-нибудь сказать мне, как использовать строку сравнения без учета регистра?

971   10  

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 = 'someone' COLLATE NOCASE

вы можете сделать это так:

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

его работа для меня отлично. SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE

Comments

    Ничего не найдено.