web-dev-qa-db-fra.com

SQLite Like% et _

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?

56
Francisc

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 .

62
mu is too short

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 ?.

82
Benoit

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.

8
DuckMaestro

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 )

0
Jan ATAC