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 :
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 :
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 :
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#
LIKErenvoieNULLsi la valeur testée estNULL: ce n'est ni vrai ni faux. UtiliserIS NULLpour tester une valeur absente.- Par défaut, SQLite ignore la casse pour les caractères ASCII (
aetA), mais pas pour la plupart des caractères accentués ou non ASCII.PRAGMA case_sensitive_like = ONrend 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 queLIKE '%Paris%'. GLOBest 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.