Vous pouvez utiliser COLLATE NOCASE
dans votre SELECT
requête:
SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE
De plus, dans SQLite, vous pouvez indiquer qu'une colonne doit être insensible à la casse lorsque vous créez la table en spécifiant collate nocase
dans la définition de colonne (les autres options sont binary
(par défaut) et rtrim
; voir ici ). Vous pouvez également spécifier collate nocase
quand vous créez un index. Par exemple:
créer un test de table
(
Text_Value text collate nocase
);
insérer dans les valeurs de test («A»);
insérer dans les valeurs de test («b»);
insérer dans les valeurs de test («C»);
créer un index Test_Text_Value_Index
sur Test (Text_Value collate nocase);
Les expressions impliquant Test.Text_Value
doivent désormais être insensibles à la casse. Par exemple:
sqlite> sélectionnez Text_Value dans Test où Text_Value = 'B';
Text_Value
----------------
b
sqlite> sélectionnez Text_Value dans Test order by Text_Value;
Text_Value
----------------
UNE
b
C
sqlite> sélectionnez Text_Value dans Test order by Text_Value desc;
Text_Value
----------------
C
b
UNE
L'optimiseur peut également potentiellement utiliser l'index pour la recherche et la correspondance insensibles à la casse sur la colonne. Vous pouvez le vérifier en utilisant la explain
commande SQL, par exemple:
sqlite> expliquer sélectionner Text_Value dans Test où Text_Value = 'b';
addr opcode p1 p2 p3
---------------- -------------- ---------- ---------- ---------------------------------
0 Aller 0 16
1 Entier 0 0
2 OpenRead 1 3 keyinfo (1, NOCASE)
3 SetNumColumns 1 2
4 cordes8 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 Colonne 1 0
12 Rappel 1 0
13 Suivant 1 9
14 Fermer 1 0
15 Arrêt 0 0
16 Transaction 0 0
17 VerifyCookie 0 4
18 Goto 0 1
19 Noop 0 0
COLLATE NOCASE
à l'index n'est pas requis si le champ lui-même a déjà ce classement défini: " La séquence de classement par défaut est la séquence de classement définie pour cette colonne dans l'instruction CREATE TABLE. "COLLATE NOCASE
ne fonctionnera qu'avec du texte ASCII. Une fois que vous avez "FIANCÉ" ou "voilà" dans vos valeurs de colonne, il ne correspondra pas à "fiancé" ou "VOILA". Après avoir activé l'extension ICU,LIKE
devient insensible à la casse ,'FIANCÉ' LIKE 'fiancé'
c'est vrai, mais'VOILA' LIKE 'voilà'
toujours faux. Et ICU + LIKE a l'inconvénient de ne pas utiliser l'index, il peut donc être lent sur les grandes tables.select * from tbl where firstname='john' and lastname='doe' COLLATE NOCASE
sera insensible à la casselastname
. Pour être insensible à la casse surfirstname
, écrire ceci:select * from tbl where firstname='john' COLLATE NOCASE and lastname='doe'
. C'est spécifique à cette colonne, pas à lawhere
clause entière .la source
Vous pouvez le faire comme ceci:
(Ce n'est pas la solution, mais dans certains cas, c'est très pratique)
la source
Ce n'est pas spécifique à sqlite mais vous pouvez simplement le faire
la source
Une autre option consiste à créer votre propre classement personnalisé. Vous pouvez ensuite définir ce classement sur la colonne ou l'ajouter à vos clauses de sélection. Il sera utilisé pour les commandes et les comparaisons.
Cela peut être utilisé pour faire «VOILA» COMME «voilà».
http://www.sqlite.org/capi3ref.html#sqlite3_create_collation
la source
Une autre option qui peut ou non avoir un sens dans votre cas, est d'avoir en fait une colonne séparée avec des valeurs pré-notées de votre colonne existante. Cela peut être rempli à l'aide de la fonction SQLite
LOWER()
, et vous pouvez ensuite effectuer une correspondance sur cette colonne à la place.Évidemment, cela ajoute de la redondance et un potentiel d'incohérence, mais si vos données sont statiques, cela pourrait être une option appropriée.
la source
Simplement, vous pouvez utiliser COLLATE NOCASE dans votre requête SELECT:
la source
Si la colonne est de type,
char
vous devez ajouter la valeur que vous interrogez avec des espaces, veuillez vous référer à cette question ici . Ceci en plus d'utiliserCOLLATE NOCASE
ou l'une des autres solutions (upper (), etc).la source
vous pouvez utiliser la requête similaire pour comparer la chaîne respective aux valeurs de table.
sélectionnez le nom de la colonne dans nom_table où le nom de la colonne comme «valeur de comparaison respective»;
la source
Cela fonctionne parfaitement pour moi.
SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE
la source