Comment définir Sqlite3 pour qu’il soit insensible à la casse lors de la comparaison de chaînes?

Je souhaite sélectionner des enregistrements de la firebase database sqlite3 par correspondance de chaîne. Mais si j’utilise ‘=’ dans la clause where, j’ai constaté que sqlite3 est sensible à la casse. Quelqu’un peut-il me dire comment utiliser la comparaison de chaînes insensible à la casse?

    Vous pouvez utiliser COLLATE NOCASE dans votre requête SELECT :

     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 la colonne (les autres options sont binary (la valeur par défaut) et rsortingm ; voir ici ). Vous pouvez également spécifier collate nocase lorsque vous créez un index. Par exemple:

     créer un tableau test
     (
       Text_Value texte 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
       on Test (Text_Value collate nocase);
    

    Les expressions impliquant Test.Text_Value devraient maintenant être insensibles à la casse. Par exemple:

     sqlite> sélectionnez Text_Value from Test où Text_Value = 'B';
     Text_Value      
     ----------------
     b               
    
     sqlite> sélectionnez Text_Value dans l'ordre de test par Text_Value;
     Text_Value      
     ----------------
     UNE               
     b               
     C    
    
     sqlite> sélectionnez Text_Value à partir de l'ordre de test par Text_Value desc;
     Text_Value      
     ----------------
     C               
     b               
     UNE               
    

    L’optimiseur peut également utiliser potentiellement l’index pour effectuer une recherche et une correspondance insensibles à la casse dans la colonne. Vous pouvez le vérifier en utilisant la commande explain SQL, par exemple:

     sqlite> expliquer sélectionnez Text_Value from Test où Text_Value = 'b';
     addr opcode p1 p2 p3                               
     ---------------- -------------- ---------- ---------- ---------------------------------
     0 Aller à 0 16                                           
     1 Entier 0 0                                            
     2 Informations clés OpenRead 1 3 (1, NOCASE)                
     3 SetNumColumns 1 2                                            
     4 Ssortingng8 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 Halte 0 0                                            
     16 Transaction 0 0                                            
     17 VerifyCookie 0 4                                            
     18 Goto 0 1                                            
     19 Noop 0 0                                            
    
     SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE 

    Vous pouvez le faire comme ceci:

     SELECT * FROM ... WHERE name LIKE 'someone' 

    (Ce n’est pas la solution, mais dans certains cas, c’est très pratique)

    “L’opérateur LIKE effectue une comparaison de correspondance de modèles. L’opérande à droite contient le motif, l’opérande gauche contient la chaîne à associer au motif. Un symbole de pourcentage (“% “) dans le motif correspond à n’importe quelle séquence de zéro ou plus Un caractère de soulignement (“_”) dans le motif correspond à n’importe quel caractère de la chaîne. Tout autre caractère correspond à lui-même ou à son équivalent en majuscules / minuscules ( correspondance insensible à la casse ) . majuscule / minuscule pour les caractères ASCII L’opérateur LIKE est sensible à la casse pour les caractères Unicode situés au-delà de la plage ASCII Par exemple, l’expression “a” LIKE “A” est TRUE mais “æ ‘LIKE” Æ est FALSE.) . ”

    Ce n’est pas spécifique à sqlite mais vous pouvez juste faire

     SELECT * FROM ... WHERE UPPER(name) = UPPER('someone') 

    Une autre option consiste à créer votre propre classement personnalisé. Vous pouvez ensuite définir ce classement sur la colonne ou l’append à vos clauses select. Il sera utilisé pour la commande et les comparaisons.

    Cela peut être utilisé pour faire ‘VOILA’ LIKE ‘voilà’.

    http://www.sqlite.org/capi3ref.html#sqlite3_create_collation

    La fonction d’assemblage doit renvoyer un nombre entier négatif, nul ou positif si la première chaîne est inférieure, égale ou supérieure à la seconde, respectivement.

    Une autre option, qui peut ou non avoir un sens dans votre cas, consiste à avoir une colonne séparée avec des valeurs pré-abaissées de votre colonne existante. Cela peut être rempli en utilisant la fonction SQLite LOWER() , et vous pouvez alors effectuer la correspondance sur cette colonne à la place.

    De toute évidence, cela ajoute une redondance et un potentiel d’incohérence, mais si vos données sont statiques, cela pourrait être une option appropriée.

    Si la colonne est de type char vous devez append la valeur que vous interrogez avec des espaces, veuillez vous référer à cette question ici . Ceci en plus d’utiliser COLLATE NOCASE ou l’une des autres solutions (upper (), etc).

    vous pouvez utiliser la même requête pour comparer la chaîne respective avec les valeurs de table.

    sélectionnez le nom de la colonne nom_table où le nom de la colonne ressemble à «valeur de comparaison respective»;

    Cela fonctionne pour moi parfaitement. SELECT NAME FROM TABLE_NAME WHERE NAME = 'test Name' COLLATE NOCASE