Elenco di caratteri speciali per la clausola SQL LIKE


119

Qual è l'elenco completo di tutti i caratteri speciali per una clausola SQL (sono interessato a SQL Server ma anche altri sarebbero buoni) clausola LIKE?

Per esempio

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

SQL Server :

  1. %
  2. _
  3. [specificatore] Ad esempio [az]
  4. [^ Specifier]
  5. Clausola ESCAPE Es.% 30! %% 'ESCAPE'! ' valuterà il 30% come vero
  6. 'i caratteri devono essere scappati con' Ad esempio, diventano loro

MySQL:

  1. % - Qualsiasi stringa di zero o più caratteri.
  2. _ - Qualsiasi singolo carattere
  3. Clausola ESCAPE Es.% 30! %% 'ESCAPE'! ' valuterà il 30% come vero

Oracolo:

  1. % - Qualsiasi stringa di zero o più caratteri.
  2. _ - Qualsiasi singolo carattere
  3. Clausola ESCAPE Es.% 30! %% 'ESCAPE'! ' valuterà il 30% come vero

Sybase

  1. %
  2. _
  3. [specificatore] Ad esempio [az]
  4. [^ Specifier]

Progresso:

  1. % - Qualsiasi stringa di zero o più caratteri.
  2. _ - Qualsiasi singolo carattere

    Guida di riferimento qui [PDF]

PostgreSQL:

  1. % - Qualsiasi stringa di zero o più caratteri.
  2. _ - Qualsiasi singolo carattere
  3. Clausola ESCAPE Es.% 30! %% 'ESCAPE'! ' valuterà il 30% come vero

ANSI SQL92:

  1. %
  2. _
  3. Un carattere ESCAPE solo se specificato .

PostgreSQL ha anche l' SIMILAR TOoperatore che aggiunge quanto segue:

  1. [specifier]
  2. [^specifier]
  3. | - una delle due alternative
  4. * - ripetizione dell'elemento precedente zero o più volte.
  5. + - ripetizione dell'elemento precedente una o più volte.
  6. () - raggruppare gli elementi insieme

L'idea è di fare di questo un wiki comunitario che possa diventare uno "sportello unico" per questo.


Probabilmente vale la pena menzionare la clausola ESCAPE. SQL Server, Oracle e MySQL lo supportano. Non so di Sybase.
Dave Webb

Sto pensando ora che la clausola ESCAPE sia SQL standard, quindi probabilmente deve essere menzionata solo una volta
Dave Webb

Non so io stesso che sia implementato in tutti i server elencati (e in quelli che potrebbero essere aggiunti in seguito) quindi sono riluttante a estrarlo in una sezione "Tutto il supporto". Se sei sicuro che siano tutti supportati, vai avanti.
Jonathan Parker

Non dimenticare di sfuggire al personaggio di fuga stesso ...
Christoffer Hammarström

Due commenti. Innanzitutto, Microsoft SQL proviene inizialmente da Sybase, quindi la somiglianza non è casuale. In secondo luogo, l'escape di una singola citazione con un'altra non è limitato a LIKE; per esempio WHERE familyname = 'O''Toole'. Terzo, l' SIMILAR TOoperatore introduce una sorta di espressione regolare ibrida, che ha le sue caratteristiche (e molti altri caratteri speciali), quindi probabilmente non dovrebbe essere inclusa qui. Immagino che faccia 3 commenti, ma nessuno si aspetta l'Inquisizione spagnola.
Manngo

Risposte:


22

Per SQL Server, da http://msdn.microsoft.com/en-us/library/ms179859.aspx :

  • % Qualsiasi stringa di zero o più caratteri.

    WHERE title LIKE '%computer%' trova tutti i titoli dei libri con la parola "computer" ovunque nel titolo del libro.

  • _ Qualsiasi singolo carattere.

    WHERE au_fname LIKE '_ean' trova tutti i nomi di quattro lettere che terminano con ean (Dean, Sean e così via).

  • [] Qualsiasi singolo carattere all'interno dell'intervallo specificato ([af]) o set ([abcdef]).

    WHERE au_lname LIKE '[C-P]arsen'trova i cognomi degli autori che finiscono con arsen e iniziano con un singolo carattere tra C e P, ad esempio Carsen, Larsen, Karsen e così via. Nelle ricerche per intervallo, i caratteri inclusi nell'intervallo possono variare a seconda delle regole di ordinamento delle regole di confronto.

  • [^] Qualsiasi carattere singolo non compreso nell'intervallo specificato ([^ af]) o impostato ([^ abcdef]).

    WHERE au_lname LIKE 'de[^l]%' tutti i cognomi degli autori che iniziano con de e dove la lettera successiva non è l.


1
Ho appena provato e sembra che tu possa. Ma non è come le espressioni regolari => [0-9] Invece devi specificare ogni carattere in questo modo: [0123456789]
Çağdaş Tekin

3
Aspetta, no. È come RegEx, quindi anche [0-9] funziona. Dispiace per la confusione.
Çağdaş Tekin

6

ANSI SQL92 :

  • %
  • _
  • un carattere ESCAPE solo se specificato .

È deludente che molti database non si attengano alle regole standard e aggiungano caratteri extra, o abilitino erroneamente ESCAPE con un valore predefinito di "\" quando manca. Come se non avessimo già abbastanza problemi con "\"!

È impossibile scrivere qui codice indipendente da DBMS, perché non sai quali caratteri dovrai sfuggire e lo standard dice che non puoi sfuggire a cose che non hanno bisogno di essere sfuggite. (Vedi sezione 8.5 / Regole generali / 3.a.ii.)

Grazie SQL! Gnnn


5

Dovresti aggiungere che devi aggiungere un extra 'per sfuggire a un'esistenza' in SQL Server:

smith's -> smith's


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

Potenziale risposta per SQL Server

Interessante Ho appena eseguito un test utilizzando LinqPad con SQL Server che dovrebbe eseguire solo Linq to SQL sotto e genera la seguente istruzione 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 '~'

Quindi non l'ho ancora testato, ma sembra che potenzialmente la ESCAPE '~'parola chiave possa consentire l'escape automatico di una stringa da utilizzare all'interno di un'espressione simile.


Probabilmente stanno usando solo ESCAPEperché consente di usare due caratteri per carattere di escape (ad esempio, %diventa ~%) invece di tre (ad esempio, senza ESCAPE, %diventa [%]).
binki
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.