Lista znaków specjalnych dla klauzuli SQL LIKE

119

Jaka jest pełna lista wszystkich znaków specjalnych dla SQL (interesuje mnie SQL Server, ale inne też byłyby dobre) klauzula LIKE?

Na przykład

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

SQL Server :

  1. %
  2. _
  3. [specyfikator] Np. [az]
  4. [^ specyfikator]
  5. Klauzula ESCAPE Np.% 30! %% 'ESCAPE'! ' uzna 30% za prawdziwe
  6. „postaciom trzeba uciec z„ Np. stają się ”

MySQL:

  1. % - Dowolny ciąg zawierający zero lub więcej znaków.
  2. _ - Dowolny pojedynczy znak
  3. Klauzula ESCAPE Np.% 30! %% 'ESCAPE'! ' uzna 30% za prawdziwe

Wyrocznia:

  1. % - Dowolny ciąg zawierający zero lub więcej znaków.
  2. _ - Dowolny pojedynczy znak
  3. Klauzula ESCAPE Np.% 30! %% 'ESCAPE'! ' uzna 30% za prawdziwe

Sybase

  1. %
  2. _
  3. [specyfikator] Np. [az]
  4. [^ specyfikator]

Postęp:

  1. % - Dowolny ciąg zawierający zero lub więcej znaków.
  2. _ - Dowolny pojedynczy znak

    Przewodnik referencyjny tutaj [PDF]

PostgreSQL:

  1. % - Dowolny ciąg zawierający zero lub więcej znaków.
  2. _ - Dowolny pojedynczy znak
  3. Klauzula ESCAPE Np.% 30! %% 'ESCAPE'! ' uzna 30% za prawdziwe

ANSI SQL92:

  1. %
  2. _
  3. Znak ESCAPE tylko wtedy, gdy jest określony .

PostgreSQL ma również SIMILAR TOoperator, który dodaje następujące elementy:

  1. [specifier]
  2. [^specifier]
  3. | - jedną z dwóch możliwości
  4. * - powtórzenie poprzedniej pozycji zero lub więcej razy.
  5. + - powtórzenie poprzedniej pozycji raz lub więcej razy.
  6. () - grupuj elementy razem

Chodzi o to, aby uczynić z tego Wiki społeczności, która może stać się „punktem kompleksowej obsługi”.

a_horse_with_no_name
źródło
Warto chyba wspomnieć o klauzuli ESCAPE. Obsługują to SQL Server, Oracle i MySQL. Nie wiem o Sybase.
Dave Webb
Myślę, że teraz klauzula ESCAPE jest standardowym SQL, więc prawdopodobnie wystarczy wspomnieć tylko raz
Dave Webb
Sam nie wiem, czy jest on zaimplementowany na wszystkich wymienionych serwerach (i wszystkich, które mogą zostać dodane później), więc niechętnie umieszczam go w sekcji „Cała obsługa”. Jeśli masz pewność, że wszyscy są obsługiwani, śmiało.
Jonathan Parker
Nie zapomnij uciec przed samą ucieczką ...
Christoffer Hammarström
Dwie uwagi. Po pierwsze, Microsoft SQL pochodzi od Sybase, więc podobieństwo nie jest przypadkowe. Po drugie, unikanie pojedynczego cytatu innym nie ogranicza się do LIKE; na przykład WHERE familyname = 'O''Toole'. Po trzecie, SIMILAR TOoperator wprowadza rodzaj hybrydowego wyrażenia regularnego, które ma swoje własne cechy (i wiele innych znaków specjalnych), więc prawdopodobnie nie powinno być tutaj zawarte. Myślę, że to 3 komentarze, ale nikt nie oczekuje hiszpańskiej inkwizycji.
Manngo

Odpowiedzi:

22

W przypadku programu SQL Server ze strony http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Dowolny ciąg zawierający zero lub więcej znaków.

    WHERE title LIKE '%computer%' znajduje wszystkie tytuły książek ze słowem „komputer” w dowolnym miejscu tytułu.

  • _ Dowolny pojedynczy znak.

    WHERE au_fname LIKE '_ean' wyszukuje wszystkie czteroliterowe imiona kończące się na ean (Dean, Sean itd.).

  • [] Dowolny pojedynczy znak w określonym zakresie ([af]) lub zestawie ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'wyszukuje nazwiska autorów kończące się na arsen i zaczynające się dowolnym pojedynczym znakiem między C a P, na przykład Carsen, Larsen, Karsen itd. W wyszukiwaniu według zakresu znaki zawarte w zakresie mogą się różnić w zależności od reguł sortowania.

  • [^] Dowolny pojedynczy znak spoza określonego zakresu ([^ af]) lub zestawu ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' wszystkie nazwiska autorów zaczynające się od de i gdzie następną literą nie jest l.

çağdaş
źródło
1
Właśnie spróbowałem i wygląda na to, że możesz. Ale to nie jest tak, jak wyrażenia regularne => [0-9] Zamiast tego musisz określić każdy znak w ten sposób: [0123456789]
Çağdaş Tekin
3
Czekaj nie. To jest jak RegEx, więc [0-9] też działa. Przepraszam za zamieszanie.
Çağdaş Tekin
6

ANSI SQL92 :

  • %
  • _
  • znak ESCAPE tylko wtedy, gdy jest określony .

Rozczarowuje fakt, że wiele baz danych nie przestrzega standardowych zasad i dodaje dodatkowe znaki lub nieprawidłowo włącza ESCAPE z domyślną wartością „\”, gdy jej brakuje. Jakby nie mamy już wystarczająco dużo problemów z '\'!

Niemożliwe jest tutaj napisanie kodu niezależnego od DBMS, ponieważ nie wiesz, jakich znaków będziesz musiał uciec, a standard mówi, że nie możesz uciec przed rzeczami, przed którymi nie trzeba uciekać. (Zobacz rozdział 8.5 / Zasady ogólne / 3.a.ii.)

Dziękuję SQL! gnnn

bobince
źródło
5

Należy dodać, że w SQL Server należy dodać dodatkowe słowo „aby uciec przed istniejącym”:

Smith's -> Smith's

user65628
źródło
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."
Uczenie się
źródło
0

Potencjalna odpowiedź dla programu SQL Server

Ciekawe Właśnie przeprowadziłem test używając LinqPad z SQL Server, który powinien po prostu uruchomić Linq to SQL pod spodem i generuje następującą instrukcję SQL.

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

Więc jeszcze tego nie testowałem, ale wygląda na to, że potencjalnie ESCAPE '~'słowo kluczowe może pozwolić na automatyczne uciekanie łańcucha do użycia w podobnym wyrażeniu.

jpierson
źródło
Prawdopodobnie używają tylko ESCAPEdlatego, że pozwalają na użycie dwóch znaków na znak ucieczki (np. %Staje się ~%) zamiast trzech (np. Bez ESCAPE, %staje się [%]).
binki