webentwicklung-frage-antwort-db.com.de

SQLite wie% und _

Ich kann nicht herausfinden, was der Unterstrich in einer SQLite like -Anweisung bewirkt. Das Platzhalterzeichen %, ist wahrscheinlich dasselbe wie in den meisten anderen SQL-Datenbanken.

Also, was macht der verdammte _ Zeichen tun?

56
Francisc

Der Unterstrich ist auch derselbe wie in den meisten anderen SQL-Datenbanken und stimmt mit jedem einzelnen Zeichen überein (d. H. Er ist derselbe wie . in einem regulären Ausdruck). Aus dem feines Handbuch :

Ein Unterstrich ("_") im LIKE-Muster entspricht einem einzelnen Zeichen in der Zeichenfolge.

Beispielsweise:

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

Und nur um sicherzustellen, dass die Ergebnisse sinnvoll sind: SQLite verwendet null und eins für boolesche Werte .

62
mu is too short

Es ist Standard-SQL, das in LIKE Ausdrücken:

  • % entspricht einer beliebigen Zeichenfolge, einschließlich einer leeren. Es ist äquivalent zu .* in einem regulären Ausdruck.
  • _ entspricht einem einzelnen Zeichen. Es ist äquivalent zu . in einem regulären Ausdruck.
  • Sie können ein Zeichen zum Entkommen wählen %, _ und sich selbst mit:

    ... WHERE expr LIKE 'a_b%c\\d\%\_' ESCAPE '\'
    

    Dies entspricht a×b×××c\d%_ oder a×bc\d%_ aber nicht abc\d%_ Noch a×b×××cd%_.

Zusätzlich zu SQLite haben Sie das Schlüsselwort GLOB, das sich genauso verhält, außer dass % wird * und _ wird ?.

82
Benoit

Nachtrag zu @ Benoits Antwort:

Das ESCAPE gilt für den neuesten LIKE Ausdruck, nicht für alle LIKE Ausdrücke. Um alles zu umgehen, müssen Sie ESCAPE mehrfach verwenden, wie unten dargestellt.

WHERE foo LIKE '%bar^%%' ESCAPE '^' AND foo LIKE '%baz^_%' ESCAPE '^'

Dieses Prädikat entspricht den Werten von foo, die bar% oder baz plus ein beliebiges Zeichen enthalten.

8
DuckMaestro

Für die Aufzeichnung verwende ich in XCode/Objective-C-Umgebung, "\" funktioniert nicht. Verwenden Sie stattdessen etwas anderes ...

Escapezeichen im C-Stil mit dem Backslash-Zeichen werden nicht unterstützt, da es sich nicht um Standard-SQL handelt ( https://www.sqlite.org/lang_expr.html )

0
Jan ATAC