2013-11-21 24 views
5

Se si estrae la definizione di operatore LIKE, vedrete che v'è un argomento opzionale chiamato ESCAPE che è descritto come segue:Perché esiste un argomento ESCAPE dell'operatore LIKE?

è un personaggio che viene messo di fronte a un carattere jolly per indica che il carattere jolly deve essere interpretato come un normale carattere e non come carattere jolly. escape_character è un'espressione di carattere che non ha valore predefinito e deve valutare solo un carattere .

Quindi, quando si scrive una clausola WHERE come indicato di seguito, dite il motore di SQL Server per trattare il punto esclamativo come un personaggio in fuga (proprio come il personaggio '\' in C#) per elencare i commenti che includono '30%' sottostringa:

WHERE comment LIKE '%30!%%' ESCAPE '!' 

Ora qui diventa confuso per me. È già possibile sfuggire ai caratteri jolly mettendoli all'interno di parentesi quadre. Perché si vorrebbe introdurre l'argomento ESCAPE? È lì per una ragione, credo.

MODIFICA: Vedo diverse risposte che spiegano come funziona ESCAPE. So che il codice ESCAPE viene utilizzato per sfuggire ai caratteri jolly, ma quello che so anche è che puoi sfuggire a questi caratteri jolly utilizzando parentesi quadre. Voglio solo capire cosa ha "metodo ESCAPE" e "metodo parentesi quadre" no.

EDIT 2: Anche se l'esempio di Szymon è totalmente valido, non ritengo che questo sia l'unico motivo per cui è stata introdotta l'ESCAPE. Naturalmente potrei sbagliarmi, ma ho il sospetto che potrebbero esserci motivi basati sulle prestazioni, non lo so per certo. Szymon, è possibile ottenere lo stesso piace segue:

DECLARE @TEST_STRING VARCHAR(100) = 'ddd]eee'; 
SELECT 'MATCHED! (Szymon)' WHERE @TEST_STRING LIKE '%[abc!]]%' ESCAPE '!'; 
SELECT 'MATCHED! (Altern)' WHERE @TEST_STRING LIKE '%[abc]%' OR @TEST_STRING LIKE '%]%'; 

Come nota a margine, non è necessario per sfuggire il carattere parentesi quadra di chiusura.

+0

Come ti cercare una sottolineatura o un segno per cento se non si può dire il motore dovrebbe * non * essere trattato come un jolly? (Btw: questo non è specifico per SQL Server, definito dallo standard SQL) –

+1

@a_horse_with_no_name: '[_]' e '[%]', rispettivamente. – Heinzi

+0

@anario La mia risposta è ciò che stai cercando? – Szymon

risposta

3

Viene spiegato inoltre un po ', credo

Inoltre, entro i caratteri doppi parentesi ([]), caratteri di escape possono essere utilizzate e l'accento circonflesso (^), trattino (-), e il diritto parentesi (]) può essere sfuggito.

Diciamo che si desidera cercare tutto ciò che contiene caratteri a, b, c o ].

Dato un insieme di caratteri è racchiuso tra parentesi [ ], si deve sfuggire alla parentesi di chiusura per renderlo uno del set:

like '%[abc!]]%' escape '!' 

Inoltre, come sottolineato nei commenti, il la sintassi per uscire usando le parentesi quadre [ ] è una funzione non standard mentre è documentato ESCAPE.

+0

Ci scusiamo per l'eliminazione e l'apertura di questa risposta, ma il mio primo tentativo non è stato corretto. Non è così facile trovare un esempio per questo. – Szymon

+1

Hai scelto un buon esempio :) –

+0

@Szymon, ho modificato la domanda e ti ho menzionato lì. –

0

Escape ha la possibilità di sfuggire ai caratteri nel contesto di corrispondenza delle stringhe e nel contesto [].

LIKE '%[1-5!%]%' ESCAPE '!' 

Ciò corrisponderà '1' o '1%' o '4' o '4%', ma non sei né il 6%

+0

In questo caso è sempre possibile usare '[%]'. – Szymon

+1

Sì, ma hanno significati diversi. [] usato per specificare l'intervallo di valori possibili, mentre l'escape per l'escape come in HTML o URL. Ma di nuovo, sì, hai ragione, può essere usato in questo modo, ma non è pensato per essere, ma i progettisti di SQL Server. Forse la fuga ha prestazioni migliori, non lo so, ma è possibile :) – evhen14

+0

Sì, forse è un abuso di [] ma funziona ancora ... – Szymon

1

Nessuno ha parlato di questo da quanto ho letto, ma se volevi anche eseguire una query per il testo contenente un letterale '[]' in cui sei costretto a sfuggire ai caratteri. Supponiamo che tu voglia interrogare la stringa contenente i caratteri letterali 'abc []'. Credo che si sarebbe costretti a costruire una query come questa:

SELECT 'MATCHED! (Szymon)' WHERE @TEST_STRING LIKE '%[abc![!]]%' ESCAPE '!'; 

Ecco un altro link sul tema: How can I escape square brackets in a LIKE clause?

Problemi correlati