Как установить Sqlite3, чтобы быть нечувствительным к регистру когда строка, выдерживающая сравнение?

Оболочка заменяет звездочку именем каждого файла в каталоге.

Чтобы передать буквальную звездочку, вы должны быть в состоянии избежать ее:

$ ./a.out 123 \*
282
задан Termininja 17 December 2016 в 00:53
поделиться

4 ответа

Вы можете использовать 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 объяснять , например:

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                                            
465
ответ дан 23 November 2019 в 01:54
поделиться
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
145
ответ дан 23 November 2019 в 01:54
поделиться

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

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

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

" LIKE оператор выполняет шаблон сравнение соответствия. Операнд для справа содержит узор, левый операнд содержит строку чтобы соответствовать шаблону. А символ процента ("%") в шаблоне соответствует любой последовательности из нуля или более символы в строке. An подчеркивание ("_") в шаблоне соответствует любому одиночному символу в строка. Любой другой символ соответствует самому или его эквиваленту в нижнем / верхнем регистре (т. Е. Соответствие без учета регистра ) . (Ошибка: только SQLite понимает верхний / нижний регистр для ASCII персонажи. Оператор LIKE - это регистр чувствителен к символам Юникода, которые выходят за пределы диапазона ASCII. Для Например, выражение 'a' LIKE 'A' ИСТИНА, но 'æ' КАК 'Æ' - ЛОЖЬ.) "

45
ответ дан 23 November 2019 в 01:54
поделиться

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

SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
40
ответ дан 23 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: