Liste der Sonderzeichen für die SQL LIKE-Klausel

119

Was ist die vollständige Liste aller Sonderzeichen für eine SQL-Klausel (ich interessiere mich für SQL Server, aber andere wären auch gut)?

Z.B

SELECT Name FROM Person WHERE Name LIKE '%Jon%'

SQL Server :

  1. %.
  2. _
  3. [Spezifizierer] ZB [az]
  4. [^ Spezifizierer]
  5. ESCAPE-Klausel ZB% 30! %% 'ESCAPE'! ' wird 30% als wahr bewerten
  6. 'Charaktere müssen entkommen werden mit' ZB werden sie zu ihnen '

MySQL:

  1. % - Beliebige Zeichenfolge mit null oder mehr Zeichen.
  2. _ - Beliebiges einzelnes Zeichen
  3. ESCAPE-Klausel ZB% 30! %% 'ESCAPE'! ' wird 30% als wahr bewerten

Orakel:

  1. % - Beliebige Zeichenfolge mit null oder mehr Zeichen.
  2. _ - Beliebiges einzelnes Zeichen
  3. ESCAPE-Klausel ZB% 30! %% 'ESCAPE'! ' wird 30% als wahr bewerten

Sybase

  1. %.
  2. _
  3. [Spezifizierer] ZB [az]
  4. [^ Spezifizierer]

Fortschritt:

  1. % - Beliebige Zeichenfolge mit null oder mehr Zeichen.
  2. _ - Beliebiges einzelnes Zeichen

    Referenzhandbuch hier [PDF]

PostgreSQL:

  1. % - Beliebige Zeichenfolge mit null oder mehr Zeichen.
  2. _ - Beliebiges einzelnes Zeichen
  3. ESCAPE-Klausel ZB% 30! %% 'ESCAPE'! ' wird 30% als wahr bewerten

ANSI SQL92:

  1. %.
  2. _
  3. Ein ESCAPE-Zeichen nur, wenn angegeben .

PostgreSQL hat auch den SIMILAR TOOperator, der Folgendes hinzufügt:

  1. [specifier]
  2. [^specifier]
  3. | - eine von zwei Alternativen
  4. * - Wiederholung des vorherigen Elements null oder mehrmals.
  5. + - Wiederholung des vorherigen Artikels ein- oder mehrmals.
  6. () - Elemente gruppieren

Die Idee ist, dies zu einem Community-Wiki zu machen, das dafür zu einem "One-Stop-Shop" werden kann.

a_horse_with_no_name
quelle
Es ist wahrscheinlich erwähnenswert, die ESCAPE-Klausel zu erwähnen. SQL Server, Oracle und MySQL unterstützen dies. Ich weiß nichts über Sybase.
Dave Webb
Ich denke jetzt ist die ESCAPE-Klausel Standard-SQL, daher muss sie wahrscheinlich nur einmal erwähnt werden
Dave Webb
Ich weiß selbst nicht, dass es auf allen aufgelisteten Servern implementiert ist (und auf allen, die später hinzugefügt werden könnten), daher zögere ich, es in einen Abschnitt "Alle Unterstützung" zu ziehen. Wenn Sie sicher sind, dass alle unterstützt werden, fahren Sie fort.
Jonathan Parker
Vergessen Sie nicht, dem Fluchtcharakter selbst zu entkommen ...
Christoffer Hammarström
Zwei Kommentare. Erstens stammt Microsoft SQL ursprünglich von Sybase, sodass die Ähnlichkeit nicht zufällig ist. Zweitens ist das Entkommen eines einzelnen Zitats mit einem anderen nicht auf Folgendes beschränkt LIKE: zum Beispiel WHERE familyname = 'O''Toole'. Drittens führt der SIMILAR TOOperator eine Art hybriden regulären Ausdruck ein, der seine eigenen Funktionen (und viele weitere Sonderzeichen) aufweist und daher hier wahrscheinlich nicht enthalten sein sollte. Ich denke, das macht 3 Kommentare, aber niemand erwartet die spanische Inquisition.
Manngo

Antworten:

22

Für SQL Server unter http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Beliebige Zeichenfolge mit null oder mehr Zeichen.

    WHERE title LIKE '%computer%' findet alle Buchtitel mit dem Wort "Computer" an einer beliebigen Stelle im Buchtitel.

  • _ Beliebiges einzelnes Zeichen.

    WHERE au_fname LIKE '_ean' findet alle aus vier Buchstaben bestehenden Vornamen, die mit ean enden (Dean, Sean usw.).

  • [] Jedes einzelne Zeichen innerhalb des angegebenen Bereichs ([af]) oder Satzes ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'findet Nachnamen des Autors, die mit arsen enden und mit einem einzelnen Zeichen zwischen C und P beginnen, z. B. Carsen, Larsen, Karsen usw. Bei der Bereichssuche können die im Bereich enthaltenen Zeichen abhängig von den Sortierregeln der Sortierung variieren.

  • [^] Jedes einzelne Zeichen, das nicht innerhalb des angegebenen Bereichs ([^ af]) oder Satzes ([^ abcdef]) liegt.

    WHERE au_lname LIKE 'de[^l]%' alle Nachnamen des Autors, die mit de beginnen und bei denen der folgende Buchstabe nicht l ist.

çağdaş
quelle
1
Ich habe es gerade versucht und es sieht so aus, als ob du es kannst. Aber es ist nicht wie reguläre Ausdrücke => [0-9] Stattdessen müssen Sie jedes Zeichen wie folgt angeben: [0123456789]
Çağdaş Tekin
3
Warte, nein. Es ist wie bei RegEx, also funktioniert [0-9] auch. Entschuldigung für die Verwirrung.
Çağdaş Tekin
6

ANSI SQL92 :

  • %.
  • _
  • ein ESCAPE-Zeichen nur, wenn angegeben .

Es ist enttäuschend, dass sich viele Datenbanken nicht an die Standardregeln halten und zusätzliche Zeichen hinzufügen oder ESCAPE mit dem Standardwert '\' falsch aktivieren, wenn es fehlt. Als hätten wir noch nicht genug Probleme mit '\'!

Es ist unmöglich, hier DBMS-unabhängigen Code zu schreiben, da Sie nicht wissen, welchen Zeichen Sie entkommen müssen, und der Standard besagt, dass Sie Dinge nicht entkommen können, die nicht entkommen müssen. (Siehe Abschnitt 8.5 / Allgemeine Regeln / 3.a.ii.)

Vielen Dank, dass Sie SQL! gnnn

Bobince
quelle
5

Sie sollten hinzufügen, dass Sie in SQL Server ein zusätzliches 'hinzufügen müssen, um einem Bestehen zu entgehen':

Schmiede -> Schmiede

user65628
quelle
1

Sybase:

%              : Matches any string of zero or more characters.
_              : Matches a single character.
[specifier]    : Brackets enclose ranges or sets, such as [a-f] 
                 or [abcdef].Specifier  can take two forms:

                 rangespec1-rangespec2: 
                   rangespec1 indicates the start of a range of characters.
                   - is a special character, indicating a range.
                   rangespec2 indicates the end of a range of characters.

                 set: 
                  can be composed of any discrete set of values, in any 
                  order, such as [a2bR].The range [a-f], and the 
                  sets [abcdef] and [fcbdae] return the same 
                  set of values.

                 Specifiers are case-sensitive.

[^specifier]    : A caret (^) preceding a specifier indicates 
                  non-inclusion. [^a-f] means "not in the range 
                  a-f"; [^a2bR] means "not a, 2, b, or R."
Lernen
quelle
0

Mögliche Antwort für SQL Server

Interessant Ich habe gerade einen Test mit LinqPad mit SQL Server ausgeführt, auf dem nur Linq to SQL ausgeführt werden sollte, und es wird die folgende SQL-Anweisung generiert.

Records .Where (r => r.Name.Contains ("lkjwer --_ ~ []"))

-- Region Parameters
DECLARE @p0 VarChar(1000) = '%lkjwer--~_~~~[]%'
-- EndRegion
SELECT [t0].[ID], [t0].[Name]
FROM [RECORDS] AS [t0]
WHERE [t0].[Name] LIKE @p0 ESCAPE '~'

Ich habe es also noch nicht getestet, aber es sieht so aus, als ob das ESCAPE '~'Schlüsselwort möglicherweise das automatische Escapezeichen einer Zeichenfolge zur Verwendung in einem ähnlichen Ausdruck ermöglicht.

jpierson
quelle
Sie verwenden wahrscheinlich nur, ESCAPEweil es die Verwendung von zwei Zeichen pro maskiertem Zeichen (z. B. %wird ~%) anstelle von drei (z. B. ohne ESCAPE, %wird [%]) ermöglicht.
Binki