Вы можете использовать COLLATE NOCASE
в своем SELECT
запросе:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Кроме того, в SQLite вы можете указать, что столбец должен быть нечувствительным к регистру при создании таблицы, указав collate nocase
в определении столбца (другие параметры binary
(по умолчанию) и rtrim
; см. Здесь ). Вы также можете указать collate nocase
при создании индекса. Например:
создать таблицу Test
(
Text_Value text collate nocase
);
вставить в тестовые значения ('A');
вставить в тестовые значения ('b');
вставить в тестовые значения ('C');
создать индекс Test_Text_Value_Index
на тесте (Text_Value collate nocase);
Выражения с участием Test.Text_Value
теперь должны быть без учета регистра. Например:
sqlite> выберите Text_Value из Test, где Text_Value = 'B';
TEXT_VALUE
----------------
б
sqlite> выберите Text_Value из тестового заказа по Text_Value;
TEXT_VALUE
----------------
б
С
sqlite> выберите Text_Value в тестовом порядке по Text_Value desc;
TEXT_VALUE
----------------
С
б
Оптимизатор также может использовать индекс для поиска и сопоставления без учета регистра в столбце. Вы можете проверить это с помощью команды explain
SQL, например:
sqlite> объяснение, выберите Text_Value из Test, где Text_Value = 'b';
код операции addr p1 p2 p3
---------------- -------------- ---------- ---------- ---------------------------------
0 Перейти 0 16
1 целое число 0 0
2 OpenRead 1 3 keyinfo (1, NOCASE)
3 SetNumColumns 1 2
4 Строка8 0 0 б
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 Колонка 1 0
12 Обратный звонок 1 0
13 Следующий 1 9
14 Закрыть 1 0
15 Останов 0 0
16 Транзакция 0 0
17 VerifyCookie 0 4
18 Перейти 0 1
19 Нооп 0 0
COLLATE NOCASE
к индексу не требуется, если в самом поле уже определено это сопоставление: « Последовательность упорядочения по умолчанию - это последовательность упорядочения, определенная для этого столбца в операторе CREATE TABLE. »COLLATE NOCASE
будет работать только с текстом ASCII. Если в ваших значениях столбца указано «FIANCÉ» или «voilà», оно не будет совпадать с «fiancé» или «VOILA». После включения расширения ICULIKE
становится нечувствительным к регистру , так что'FIANCÉ' LIKE 'fiancé'
это правда, но'VOILA' LIKE 'voilà'
все еще ложь. И у ICU + LIKE есть недостаток - не использовать индекс, поэтому он может быть медленным на больших таблицах.select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
будет без учета регистраlastname
. Чтобы быть чувствительны к регистру наfirstname
, написать это:select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. Это относится только к одному столбцу, а не ко всемуwhere
предложению.источник
Вы можете сделать это так:
(Это не решение, но в некоторых случаях очень удобно)
источник
Это не относится к sqlite, но вы можете просто сделать
источник
Другой вариант - создать свой собственный порядок сортировки. Затем вы можете установить это сопоставление в столбце или добавить его к выбранным предложениям. Он будет использоваться для упорядочивания и сравнения.
Это может быть использовано, чтобы сделать 'VOILA' LIKE 'voilà'.
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
источник
Другой вариант, который может иметь или не иметь смысла в вашем случае, это фактически иметь отдельный столбец с предварительно заниженными значениями существующего столбца. Это можно заполнить с помощью функции SQLite
LOWER()
, и вы можете вместо этого выполнить сопоставление для этого столбца.Очевидно, что это добавляет избыточность и возможность несогласованности, но если ваши данные статичны, это может быть подходящим вариантом.
источник
Просто вы можете использовать COLLATE NOCASE в вашем запросе SELECT:
источник
Если столбец имеет тип,
char
вам необходимо добавить значение, которое вы запрашиваете, с пробелами, пожалуйста, обратитесь к этому вопросу здесь . Это в дополнение к использованиюCOLLATE NOCASE
или одного из других решений (upper () и т. Д.).источник
Вы можете использовать подобный запрос для сравнения соответствующей строки с табличными значениями.
выберите имя столбца из table_name, где имя столбца, как «соответствующее значение сравнения»;
источник
Это работает для меня отлично.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE
источник