Yanıtlar:
Sen kullanabilirsiniz COLLATE NOCASE
sizin de SELECT
sorguda:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Ayrıca, SQLite'de, collate nocase
sütun tanımında (diğer seçenekler binary
(varsayılan) ve burayartrim
bakın ) tabloyu oluştururken bir sütunun büyük / küçük harfe duyarlı olmaması gerektiğini belirtebilirsiniz . Ne zaman bir dizin oluşturacağınızı da belirtebilirsiniz . Örneğin:collate nocase
tablo oluştur Test ( Text_Value metin harmanlama nocase ); Test değerlerine girin ('A'); Test değerlerine girin ('b'); Test değerlerine girin ('C'); dizin oluştur Test_Text_Value_Index Testte (Text_Value collate nocase);
İlgili ifadeler Test.Text_Value
artık büyük / küçük harfe duyarsız olmalıdır. Örneğin:
sqlite> Test'ten Text_Value'yu seçin; burada Text_Value = 'B'; TEXT_VALUE ---------------- b sqlite> Text_Value tarafından Test siparişinden Text_Value seçin; TEXT_VALUE ---------------- bir b C sqlite> Text_Value tarafından Test sırasından Text_Value seçin; TEXT_VALUE ---------------- C b bir
Optimize edici ayrıca büyük olasılıkla büyük / küçük harfe duyarlı olmayan arama ve eşleme için dizinden yararlanabilir. Bunu explain
SQL komutunu kullanarak kontrol edebilirsiniz , örneğin:
sqlite> açıklamak Test'ten Text_Value'yu seçin; burada Text_Value = 'b'; addr opcode p1 p2 p3 ---------------- -------------- ---------- ---------- --------------------------------- 0 Git 0 16 1 Tamsayı 0 0 2 OpenRead 1 3 keyinfo (1, NOCASE) 3 SetNumColumns 1 2 4 Tel 8 0 0 b 5 IsNull -1 14 6 Marka Kaydı 1 0 a 7 MemStore 0 0 8 MoveGe 1 14 9 MemLoad 0 0 10 IdxGE 1 14 + 11 Sütun 1 0 12 Geri Arama 1 0 13 Sonraki 1 9 14 Kapat 1 0 15 Durdur 0 0 15 İşlem 0 0 17 VerifyCookie 0 4 18 Git 0 1 Bölüm Noop 0 0
COLLATE NOCASE
, alanın zaten bu harmanlama tanımlanmışsa dizine ekleme yapılması gerekmez: " Varsayılan harmanlama sırası, CREATE TABLE ifadesinde bu sütun için tanımlanan harmanlama
COLLATE NOCASE
yalnızca ASCII metinleriyle çalışır. Sütun değerlerinizde "FIANCÉ" veya "voilà" varsa, "nişanlı" veya "VOILA" ile eşleşmez. ICU uzantısını etkinleştirdikten sonra büyük / LIKE
küçük harfe duyarsız hale gelir , bu yüzden 'FIANCÉ' LIKE 'fiancé'
doğrudur, ancak 'VOILA' LIKE 'voilà'
yine de yanlıştır. Ve YBÜ + LIKE, endeksi kullanmama dezavantajına sahiptir, bu nedenle büyük tablolarda yavaş olabilir.
select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
büyük / küçük harfe duyarsız olacak lastname
. Harf duyarsız olmak için firstname
, bunu yazmak: select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. Tüm where
cümleye değil, o sütuna özgüdür .
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Bunu şu şekilde yapabilirsiniz:
SELECT * FROM ... WHERE name LIKE 'someone'
(O değil çözüm, ancak bazı durumlarda çok uygundur)
" LIKE operatörü bir desen eşleştirme karşılaştırması yapar. Sağdaki işlenen desen içerir, soldaki işlenen desenle eşleşecek dizeyi içerir. Desendeki yüzde sembolü ("% ") sıfır veya daha fazla diziyle eşleşir Desendeki bir alt çizgi ("_"), dizedeki herhangi bir karakterle eşleşir . Başka herhangi bir karakter kendisiyle veya küçük / büyük harf eşdeğeriyle eşleşir (örn. büyük / küçük harf duyarsız eşleme) . (Bir hata: SQLite yalnızca anlar ASCII karakterleri için büyük / küçük harf LIKE işleci, ASCII aralığının ötesindeki unicode karakterler için büyük / küçük harfe duyarlıdır.Örneğin, 'a' LIKE 'A' ifadesi TRUE olur ancak 'æ' LIKE 'Æ'yanlış.)."
Bu sqlite'a özgü değildir, ancak
SELECT * FROM ... WHERE UPPER(name) = UPPER('someone')
Başka bir seçenek de kendi özel harmanlamanızı oluşturmaktır. Daha sonra bu harmanlamayı sütunda ayarlayabilir veya seçtiğiniz cümlelere ekleyebilirsiniz. Sipariş ve karşılaştırmalar için kullanılacaktır.
Bu, 'VOILA' GİBİ 'voilà' yapmak için kullanılabilir.
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
İlk dize, sırasıyla ikinci dizeden küçük, eşit veya büyükse, harmanlama işlevi negatif, sıfır veya pozitif bir tamsayı döndürmelidir.
Sizin durumunuzda mantıklı gelebilecek veya gelmeyebilecek bir başka seçenek de, mevcut sütununuzun önceden düşük değerli değerlerine sahip ayrı bir sütuna sahip olmaktır. Bu, SQLite işlevi kullanılarak doldurulabilir LOWER()
ve bunun yerine bu sütunda eşleştirme yapabilirsiniz.
Açıkçası, fazlalık ve tutarsızlık potansiyeli ekler, ancak verileriniz statikse uygun bir seçenek olabilir.
Basitçe, SELECT sorgunuzda COLLATE NOCASE kullanabilirsiniz:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
Sütun char
türdeyse, boşluklarla sorguladığınız değeri eklemeniz gerekir, lütfen buradaki soruya bakın . Bu COLLATE NOCASE
veya diğer çözümlerden birine (upper (), vb.) Ek olarak.
ilgili dizeyi tablo değerleriyle karşılaştırmak için benzer sorguyu kullanabilirsiniz.
tablo_adından sütun adını seçin; burada sütun adı 'ilgili karşılaştırma değeri' gibi;
Benim için çalışıyor Mükemmel.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE