SQLite
 sql >> Base de données >  >> RDS >> SQLite

Comment rendre l'opérateur LIKE de SQLite sensible à la casse

Par défaut, le SQLite LIKE L'opérateur est insensible à la casse pour les caractères ASCII. Cela signifie qu'il correspondra aux caractères majuscules et minuscules, quelle que soit la casse que vous utilisez dans votre modèle.

Cependant, il existe une technique que vous pouvez utiliser pour la rendre sensible à la casse.

SQLite a une instruction PRAGMA appelée case_sensitive_like , qui est conçu pour faire spécifiquement le LIKE opérateur sensible à la casse pour les caractères ASCII.

La raison pour laquelle je spécifie "caractères ASCII" est que le LIKE l'opérateur est sensible à la casse par défaut pour les caractères unicode qui sont au-delà de la plage ASCII.

Par conséquent, si vous avez besoin du LIKE l'opérateur doit être sensible à la casse dans la plage ASCII, le case_sensitive_like La déclaration PRAGMA pourrait être ce que vous recherchez.

Ceci s'applique également au like() fonction, qui fonctionne exactement de la même manière que la fonction LIKE opérateur.

Activer/Désactiver la sensibilité à la casse

Vous pouvez utiliser l'une des valeurs booléennes suivantes pour activer la sensibilité à la casse :

1
on
true
yes

Vous pouvez utiliser l'une des valeurs booléennes suivantes pour désactiver la sensibilité à la casse :

0
off
false
no

L'argument peut être entre parenthèses ou il peut être séparé du nom du pragma par un signe égal.

Les arguments de mot-clé peuvent éventuellement apparaître entre guillemets.

Exemple insensible à la casse

Voyons d'abord ce qui se passe lorsque nous n'utilisons pas le case_sensitive_like Déclaration PRAGMA.

SELECT 
  'a' LIKE 'A',
  'æ' LIKE 'Æ';

Résultat :

'a' LIKE 'A'  'æ' LIKE 'Æ'
------------  ------------
1             0           

Dans ce cas, la première colonne est insensible à la casse - le A majuscule correspond à la minuscule a .

Et voici une requête sur une table de base de données.

SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Résultat :

CatName     CatName LIKE 'br%'
----------  ------------------
Brush       1                 
Brash       1                 
Broosh      1                 
100%Fluff   0                 
100$Fluff   0                 

Dans ce cas, nous obtenons une correspondance contre tous les chats dont les noms commencent par Br , même si nos critères utilisaient un b minuscule .

Exemple sensible à la casse

Voyons maintenant ce qui se passe lorsque nous utilisons le case_sensitive_like Instruction PRAGMA pour activer la sensibilité à la casse dans la plage ASCII.

PRAGMA case_sensitive_like = 1;
SELECT 
  'a' LIKE 'A',
  'æ' LIKE 'Æ';

Résultat :

'a' LIKE 'A'  'æ' LIKE 'Æ'
------------  ------------
0             0           

Donc cette fois le A majuscule n'est pas correspond à la minuscule a .

Et voici l'exemple de base de données après avoir activé la sensibilité à la casse.

SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Résultat :

CatName     CatName LIKE 'br%'
----------  ------------------
Brush       0                 
Brash       0                 
Broosh      0                 
100%Fluff   0                 
100$Fluff   0                 

Notez que je n'ai pas eu besoin d'exécuter à nouveau l'instruction PRAGMA. Le paramètre reste en place pour ma connexion jusqu'à ce que je le modifie.

Désactiver la sensibilité à la casse

Voici un exemple de désactivation de la sensibilité à la casse et d'exécution de la requête à nouveau.

PRAGMA case_sensitive_like = 0;
SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Résultat :

CatName     CatName LIKE 'br%'
----------  ------------------
Brush       1                 
Brash       1                 
Broosh      1                 
100%Fluff   0                 
100$Fluff   0                 

La fonction Like()

Comme mentionné, le case_sensitive_like L'instruction PRAGMA affecte également le like() fonction.

PRAGMA case_sensitive_like = 1;
SELECT 
  CatName,
  like('Br%', CatName),
  like('br%', CatName)
FROM Cats;

Résultat :

CatName     like('Br%', CatName)  like('br%', CatName)
----------  --------------------  --------------------
Brush       1                     0                   
Brash       1                     0                   
Broosh      1                     0                   
100%Fluff   0                     0                   
100$Fluff   0                     0                   

Opérateur LIKE compatible Unicode

Vous pouvez également utiliser l'extension SQLite ICU si vous avez besoin d'un LIKE compatible Unicode opérateur.

L'implémentation de LIKE inclus dans cette extension utilise la fonction ICU u_foldCase() pour fournir des comparaisons indépendantes de la casse pour la gamme complète de caractères Unicode.