Jawaban:
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 sensitive lastname
. Menjadi kasus sensitif pada firstname
, menulis ini: select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. Ini khusus untuk satu kolom, bukan seluruh where
klausa.
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Anda dapat melakukannya seperti ini:
SELECT * FROM ... WHERE name LIKE 'someone'
(Ini bukan yang solusi, tetapi dalam beberapa kasus sangat nyaman)
" Operator LIKE melakukan perbandingan pola yang cocok. Operan ke kanan berisi pola, operan kiri berisi string yang cocok dengan pola. Simbol persen ("% ") dalam pola cocok dengan urutan nol atau lebih karakter dalam string. Garis bawah ("_") dalam pola cocok dengan karakter tunggal apa pun dalam string. Karakter lainnya cocok dengan dirinya sendiri atau setara dengan huruf kecil / huruf besar (yaitu pencocokan case-insensitive ) . (Bug: SQLite hanya mengerti huruf besar / kecil untuk karakter ASCII. Operator LIKE peka huruf besar-kecil untuk karakter unicode yang berada di luar rentang ASCII. Misalnya, ekspresi 'a' LIKE 'A' BENAR tetapi 'æ' LIKE 'Æ'adalah FALSE.). "
Ini tidak khusus untuk sqlite tetapi Anda bisa melakukannya
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
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
Fungsi susun harus mengembalikan bilangan bulat yang negatif, nol, atau positif jika string pertama kurang dari, sama dengan, atau lebih besar dari yang kedua.
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.
Cukup, Anda dapat menggunakan COLLATE NOCASE dalam permintaan SELECT Anda:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Jika kolom bertipe char
maka Anda perlu menambahkan nilai yang Anda tanyakan spasi, silakan lihat pertanyaan ini di sini . Ini selain menggunakan COLLATE NOCASE
atau salah satu solusi lain (atas (), dll).
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';
Ini bekerja untuk saya. Sempurna.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE