Aller au contenu

Aide-mémoire — Opérateurs#

essentiel

Arithmétiques#

+, -, *, /, %

Comparaison#

=, ==, !=, <>, <, >, <=, >=

Logiques#

AND, OR, NOT

Autres#

Opérateur Usage
BETWEEN a AND b Intervalle inclusif essentiel
IN (...) Appartenance à une liste essentiel
LIKE Motif texte (%, _) essentiel
IS NULL / IS NOT NULL Test de nullité essentiel
\|\| Concaténation de chaînes essentiel
IS / IS NOT Comparaison NULL-safe courant
GLOB Motif style shell (*, ?), sensible à la casse courant
COLLATE Force une collation (BINARY, NOCASE, RTRIM) avancé
-> / ->> Extraction JSON (SQLite ≥ 3.38) avancé
&, \|, <<, >>, ~ Opérateurs binaires avancé

LIKE : rechercher un motif dans un texte#

LIKE compare une valeur texte à un motif. Le motif n'est pas une expression régulière : seuls deux caractères ont une signification spéciale.

Joker Signification Exemple dans le motif A%
% Zéro, un ou plusieurs caractères Alice, A, Atlantique
_ Exactement un caractère A1, AB, mais pas A

La forme générale est :

expression [NOT] LIKE motif

Le motif est placé entre apostrophes. La position des jokers détermine où le texte peut varier :

-- Commence par « Paris » : Paris, Parisien...
SELECT nom FROM villes
WHERE nom LIKE 'Paris%';

-- Se termine par « sur » : Toulouse-sur..., etc.
SELECT nom FROM villes
WHERE nom LIKE '%sur';

-- Contient « mer » n'importe où dans le titre
SELECT titre FROM films
WHERE titre LIKE '%mer%';

-- « A », puis exactement deux caractères, puis « e »
SELECT nom FROM villes
WHERE nom LIKE 'A__e';

Sans % ni _, LIKE se comporte comme une comparaison de texte, mais avec les règles de casse propres à SQLite. NOT LIKE inverse le résultat :

SELECT titre FROM films
WHERE titre NOT LIKE '%guerre%';

Construire le motif avec une valeur#

Pour chercher un texte fourni par l'utilisateur à l'intérieur d'une colonne, on ajoute les % autour du paramètre. Les paramètres évitent de fabriquer une requête en concaténant directement une saisie utilisateur :

SELECT titre FROM films
WHERE titre LIKE '%' || :recherche || '%';

Ici, :recherche = 'mer' produit le motif '%mer%'. Les apostrophes délimitent le motif SQL ; elles ne font pas partie du texte recherché.

Rechercher un % ou un _ littéral#

Dans un motif, % et _ sont des jokers. Pour rechercher l'un de ces caractères lui-même, on choisit un caractère d'échappement avec ESCAPE, puis on le place devant le joker :

-- Cherche les codes qui commencent par « 100% »
SELECT code FROM produits
WHERE code LIKE '100\\%%' ESCAPE '\\';

-- Cherche le texte « 10_20 » exactement à cet endroit
SELECT code FROM produits
WHERE code LIKE '10\\_20' ESCAPE '\\';

Dans ces exemples, \\% signifie un % littéral et le dernier % reste un joker. Si le caractère d'échappement doit lui-même être recherché, il faut également l'échapper.

Points importants dans SQLite#

  • LIKE renvoie NULL si la valeur testée est NULL : ce n'est ni vrai ni faux. Utiliser IS NULL pour tester une valeur absente.
  • Par défaut, SQLite ignore la casse pour les caractères ASCII (a et A), mais pas pour la plupart des caractères accentués ou non ASCII. PRAGMA case_sensitive_like = ON rend la comparaison ASCII sensible à la casse ; ce réglage est déconseillé dans les nouvelles applications.
  • Un motif qui commence par % ne peut généralement pas profiter d'un index B-tree pour chercher un préfixe. LIKE 'Paris%' est donc plus favorable à l'indexation que LIKE '%Paris%'.
  • GLOB est une alternative SQLite sensible à la casse qui utilise * et ? au lieu de % et _ : nom GLOB 'Paris*'.

Priorité (décroissante) avancé#

~  + (unaire)  - (unaire)
COLLATE
||  ->  ->>
*  /  %
+  -
&  |  <<  >>
<  <=  >  >=
=  ==  !=  <>  IS  IS NOT  IN  LIKE  GLOB  MATCH  REGEXP  BETWEEN
NOT
AND
OR

En cas de doute, parenthéser — en particulier lorsqu'on mélange AND et OR.

SQLite

REGEXP nécessite une fonction utilisateur enregistrée (non implémentée nativement). LIKE est insensible à la casse pour l'ASCII uniquement.