Anda dapat menggunakan COLLATE NOCASE
dalam SELECT
permintaan Anda :
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Selain itu, dalam SQLite, Anda bisa menunjukkan bahwa kolom harus peka huruf besar-kecil ketika Anda membuat tabel dengan menentukan collate nocase
dalam definisi kolom (opsi lain adalah binary
(default) dan rtrim
; lihat di sini ). Anda dapat menentukan collate nocase
kapan Anda membuat indeks juga. Sebagai contoh:
buat tabel Test
(
Text_Value menyusun teks nocase
);
masukkan ke dalam nilai Test ('A');
masukkan ke dalam nilai Test ('b');
masukkan ke dalam nilai Test ('C');
buat indeks Test_Text_Value_Index
pada Uji (Text_Value collate nocase);
Ekspresi yang melibatkan Test.Text_Value
sekarang harus peka huruf besar-kecil. Sebagai contoh:
sqlite> pilih Text_Value dari Test di mana Text_Value = 'B';
Text_Value
----------------
b
sqlite> pilih Text_Value dari Test order oleh Text_Value;
Text_Value
----------------
SEBUAH
b
C
sqlite> pilih Text_Value dari Test order oleh Text_Value desc;
Text_Value
----------------
C
b
SEBUAH
Pengoptimal juga dapat berpotensi menggunakan indeks untuk pencarian dan pencocokan case-sensitive pada kolom. Anda dapat memeriksa ini menggunakan explain
perintah SQL, misalnya:
sqlite> jelaskan pilih Text_Value dari Tes di mana 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 Kolom 1 0
12 Panggilan Balik 1 0
13 Selanjutnya 1 9
14 Tutup 1 0
15 Berhenti 0 0
16 Transaksi 0 0
17 VerifyCookie 0 4
18 Goto 0 1
19 Noop 0 0
COLLATE NOCASE
ke indeks tidak diperlukan jika bidang itu sendiri sudah memiliki susunan ini: " Urutan susun bawaan adalah urutan susun yang ditentukan untuk kolom itu dalam pernyataan CREATE TABLE. "COLLATE NOCASE
hanya akan bekerja dengan teks ASCII. Setelah Anda memiliki "FIANCÉ" atau "voilà" di nilai kolom Anda, itu tidak akan cocok dengan "tunangan" atau "VOILA". Setelah mengaktifkan ekstensi ICU,LIKE
menjadi case-insensitive , jadi'FIANCÉ' LIKE 'fiancé'
benar, tetapi'VOILA' LIKE 'voilà'
masih salah. Dan ICU + LIKE memiliki kelemahan karena tidak menggunakan indeks, sehingga bisa lambat pada tabel besar.select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
akan case case on sensitivelastname
. Menjadi kasus sensitif padafirstname
, menulis ini:select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. Ini khusus untuk satu kolom, bukan seluruhwhere
klausa.sumber
Anda dapat melakukannya seperti ini:
(Ini bukan yang solusi, tetapi dalam beberapa kasus sangat nyaman)
sumber
Ini tidak khusus untuk sqlite tetapi Anda bisa melakukannya
sumber
Pilihan lain adalah membuat koleksi kustom Anda sendiri. Anda kemudian dapat mengatur susunan itu pada kolom atau menambahkannya ke klausa pilih Anda. Ini akan digunakan untuk pemesanan dan perbandingan.
Ini dapat digunakan untuk membuat 'VOILA' LIKE 'voilà'.
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
sumber
Pilihan lain yang mungkin atau mungkin tidak masuk akal dalam kasus Anda, adalah untuk benar-benar memiliki kolom terpisah dengan nilai pra-rendahnya kolom Anda yang ada. Ini dapat diisi menggunakan fungsi SQLite
LOWER()
, dan Anda kemudian dapat melakukan pencocokan pada kolom ini.Jelas, ini menambah redundansi dan potensi inkonsistensi, tetapi jika data Anda statis, itu mungkin pilihan yang cocok.
sumber
Cukup, Anda dapat menggunakan COLLATE NOCASE dalam permintaan SELECT Anda:
sumber
Jika kolom bertipe
char
maka Anda perlu menambahkan nilai yang Anda tanyakan spasi, silakan lihat pertanyaan ini di sini . Ini selain menggunakanCOLLATE NOCASE
atau salah satu solusi lain (atas (), dll).sumber
Anda bisa menggunakan query seperti untuk membandingkan string masing-masing dengan tabel tabel.
pilih nama kolom dari table_name di mana nama kolom seperti 'masing-masing nilai pembanding';
sumber
Ini bekerja untuk saya. Sempurna.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE
sumber