Как настроить Sqlite3 без учета регистра при сравнении строк?

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

вопрос задан 10.06.2009
quantity
1456 репутация

10 ответов


  • 411 рейтинг

    Вы можете использовать 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                                            
    
    ответ дан cheduardo, с репутацией 4574, 10.06.2009
  • 142 рейтинг
    SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
    
    ответ дан Craz, с репутацией 6088, 10.06.2009
  • 39 рейтинг

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

    SELECT * FROM ... WHERE name LIKE 'someone'
    

    (Это не решение , но в некоторых случаях очень удобно)

    "Оператор LIKE делает шаблон сопоставление сравнения. Операнд для право содержит образец, левый операнд содержит строку чтобы соответствовать шаблону. символ процента ("%") в шаблоне соответствует любой последовательности от нуля или более символы в строке. подчеркивание ("_") в шаблоне соответствует любому отдельному символу в строка. Любой другой символ соответствует Сам или его нижний / верхний регистр эквивалент (т.е. е. без учета регистра соответствия) . (Ошибка: только SQLite понимает верхний / нижний регистр для ASCII персонажи. Оператор LIKE - это случай чувствителен к символам юникода, которые находятся за пределами диапазона ASCII. За Например, выражение 'a' LIKE 'A' TRUE, но '' 'LIKE' Æ '- FALSE. ). "

    ответ дан Nick Dandoulakis, с репутацией 35488, 10.06.2009
  • 35 рейтинг

    Это не относится к sqlite, но вы можете просто сделать

    SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
    
    ответ дан oscarkuo, с репутацией 7425, 10.06.2009
  • 2 рейтинг

    Еще один вариант - создать свой собственный порядок сортировки. Затем вы можете установить это сопоставление в столбце или добавить его в выбранные предложения. Он будет использоваться для упорядочивания и сравнения.

    Это можно использовать, чтобы сделать VOILA LIKE voilà.

    http: // www. SQLite. орг / capi3ref. html # sqlite3_create_collation

    Функция сортировки должна возвращать целое число, которое является отрицательным, нулевым или положительным, если первая строка меньше, равна или больше второй, соответственно.

    ответ дан Nick Ericson, с репутацией 21, 21.10.2014
  • 1 рейтинг

    Другой вариант, который может иметь или не иметь смысла в вашем случае, - это фактически иметь отдельный столбец с предварительно заниженными значениями существующего столбца. Это можно заполнить с помощью функции SQLite LOWER(), и вы можете вместо этого выполнить сопоставление для этого столбца.

    Очевидно, что это добавляет избыточность и возможность несогласованности, но если ваши данные статичны, это может быть подходящим вариантом.

    ответ дан BadCash, с репутацией 3509, 23.04.2017
  • 0 рейтинг

    Просто, вы можете использовать COLLATE NOCASE в вашем запросе SELECT:

    SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
    
    ответ дан Pullat Junaid, с репутацией 106, 27.09.2018
  • 0 рейтинг

    вы можете использовать аналогичный запрос для сравнения соответствующей строки с табличными значениями.

    выбрать имя столбца из table_name, где имя столбца, как «соответствующее значение сравнения»;

    ответ дан Mahendranatarajan, с репутацией 16, 29.06.2017
  • 0 рейтинг

    Если столбец имеет тип char, то вам необходимо добавить значение, которое вы запрашиваете с пробелами, пожалуйста, обратитесь к этому вопросу здесь . Это в дополнение к использованию COLLATE NOCASE или одного из других решений (upper () и т. Д.).

    ответ дан Has AlTaiar, с репутацией 2819, 1.05.2013
  • -1 рейтинг

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

    ответ дан Shohel Rana, с репутацией 485, 20.09.2017