Je n'arrive pas à comprendre ce que le caractère de soulignement fait dans une instruction SQLite like
. Le caractère générique, %
, est probablement le même que dans la plupart des autres bases de données SQL.
Alors, qu'est-ce que le maudit _
personnage faire?
Le trait de soulignement est également identique à celui de la plupart des autres bases de données SQL et correspond à n’importe quel caractère (c’est-à-dire identique à .
dans une expression régulière). Du manuel fin :
Un trait de soulignement ("_") dans le modèle LIKE correspond à n'importe quel caractère de la chaîne.
Par exemple:
-- The '_' matches the single 'c'
sqlite> select 'pancakes' like 'pan_akes';
1
-- This would need '__' to match the 'ca', only one '_' fails.
sqlite> select 'pancakes' like 'pan_kes';
0
-- '___' also fails, one too many '_'.
sqlite> select 'pancakes' like 'pan___kes';
0
Et pour vous assurer que les résultats ont un sens: SQLite utilise zéro et un pour les booléens .
C'est le SQL standard que dans LIKE
expressions:
%
correspond à n'importe quelle séquence de caractères, y compris un caractère vide. C'est équivalent à .*
dans une expression régulière._
correspond à un seul caractère. C'est équivalent à .
dans une expression régulière.Vous pouvez choisir un personnage pour échapper à %
, _
et lui-même avec:
... WHERE expr LIKE 'a_b%c\\d\%\_' ESCAPE '\'
Cela correspondra à a×b×××c\d%_
ou a×bc\d%_
mais non abc\d%_
ni a×b×××cd%_
.
De plus, avec SQLite, vous avez le mot-clé GLOB
qui se comporte exactement de la même manière, sauf que %
devient *
et _
devient ?
.
Addendum à la réponse de Benoît:
Le ESCAPE
s'applique à la plus récente expression LIKE
et non à toutes les expressions LIKE
. Pour tout échapper, vous devez utiliser ESCAPE
plusieurs fois, comme ci-dessous.
WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^'
Ce prédicat correspond aux valeurs de foo
qui contiennent bar%, ou baz plus tout caractère.
Pour mémoire, j’utilise dans l’environnement XCode/Objective-C, "\" ne fonctionne pas. Utilisez autre chose à la place ...
Les échappements de style C utilisant le caractère barre oblique inversée ne sont pas pris en charge car ils ne sont pas du code SQL standard ( https://www.sqlite.org/lang_expr.html )