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.


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.


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


5

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

Schmiede -> Schmiede


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

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.