Możesz użyć COLLATE NOCASE
w swoim SELECT
zapytaniu:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Dodatkowo w SQLite możesz wskazać, że podczas tworzenia tabeli kolumna nie rozróżnia wielkości liter, określając collate nocase
definicję kolumny (inne opcje to binary
(domyślne) i rtrim
; patrz tutaj ). Możesz również określić, collate nocase
kiedy tworzysz indeks. Na przykład:
Utwórz test tabeli
(
Text_Value tekst zestawia nocase
);
wstawić do wartości testowych („A”);
wstawić do wartości testowych („b”);
wstawić do wartości testowych („C”);
utwórz indeks Test_Text_Value_Index
w teście (Text_Value zestawiać nocase);
Wyrażenia obejmujące nie Test.Text_Value
powinny uwzględniać wielkości liter. Na przykład:
sqlite> wybierz Text_Value z Test gdzie Text_Value = 'B';
Text_Value
----------------
b
sqlite> wybierz Text_Value z zlecenia Test według Text_Value;
Text_Value
----------------
ZA
b
do
sqlite> wybierz Text_Value z Kolejność testowa według Text_Value desc;
Text_Value
----------------
do
b
ZA
Optymalizator może również potencjalnie wykorzystywać indeks do wyszukiwania i dopasowywania bez rozróżniania wielkości liter w kolumnie. Możesz to sprawdzić za pomocą explain
polecenia SQL, np .:
sqlite> wyjaśnij wybierz Text_Value z Test gdzie Text_Value = 'b';
adres kodowy p1 p2 p3
---------------- -------------- ---------- ---------- ---------------------------------
0 Idź 0 16
1 liczba całkowita 0 0
2 OpenRead 1 3 keyinfo (1, NOCASE)
3 SetNumColumns 1 2
4 Ciąg 8 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 Kolumna 1 0
12 Oddzwonienie 1 0
13 Dalej 1 9
14 Zamknij 1 0
15 Zatrzymanie 0 0
16 Transakcja 0 0
17 VerifyCookie 0 4
18 Idź do 0 1
19 Noop 0 0
COLLATE NOCASE
do indeksu nie jest wymagane, jeśli samo pole ma już zdefiniowane to zestawienie: „ Domyślną sekwencją zestawiania jest sekwencja zestawiania zdefiniowana dla tej kolumny w instrukcji CREATE TABLE. ”COLLATE NOCASE
będzie działać tylko z tekstem ASCII. Gdy w kolumnach pojawi się napis „FIANCÉ” lub „voilà”, nie będzie on pasował do „narzeczonego” lub „VOILA”. Po włączeniu rozszerzenia ICULIKE
staje się bez rozróżniania wielkości liter , więc'FIANCÉ' LIKE 'fiancé'
jest to prawda, ale'VOILA' LIKE 'voilà'
nadal jest fałszywe. ICU + LIKE ma tę wadę, że nie używa indeksu, więc może być powolny na dużych stołach.select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
będzie rozróżnianie wielkości literlastname
. Aby być niewrażliwy na przypadekfirstname
, to napisać:select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. Jest specyficzny dla tej jednej kolumny, a nie całejwhere
klauzuli.źródło
Możesz to zrobić w następujący sposób:
(To nie jest rozwiązanie, ale w niektórych przypadkach jest bardzo wygodne)
źródło
Nie jest to specyficzne dla sqlite, ale możesz po prostu to zrobić
źródło
Inną opcją jest utworzenie własnego sortowania niestandardowego. Następnie możesz ustawić to sortowanie w kolumnie lub dodać je do wybranych klauzul. Będzie on używany do zamawiania i porównań.
Można to wykorzystać do wytworzenia „VOILA” LIKE „voilà”.
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
źródło
Inną opcją, która może, ale nie musi mieć sensu w twoim przypadku, jest posiadanie osobnej kolumny z wcześniej obniżonymi wartościami istniejącej kolumny. Można to wypełnić za pomocą funkcji SQLite
LOWER()
, a zamiast tego można wykonać dopasowanie w tej kolumnie.Oczywiście dodaje to nadmiarowości i potencjalnie może powodować niespójność, ale jeśli dane są statyczne, może to być odpowiednia opcja.
źródło
Po prostu możesz użyć COLLATE NOCASE w zapytaniu SELECT:
źródło
Jeśli kolumna jest typu,
char
to musisz dodać spację do kwerendy, zapoznaj się z tym pytaniem tutaj . To oprócz użyciaCOLLATE NOCASE
lub jednego z innych rozwiązań (górny () itp.).źródło
możesz użyć podobnego zapytania do porównania odpowiedniego ciągu z wartościami w tabeli.
wybierz nazwę kolumny z nazwa_tabeli, gdzie nazwa kolumny jak „odpowiednia wartość porównawcza”;
źródło
Działa dla mnie doskonale.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE
źródło