2012-05-29 21 views
26

Ho una query SQL come di seguito.SQL 'LIKE' query utilizzando '%' dove il criterio di ricerca contiene '%'

Select * from table 
where name like '%' + search_criteria + '%' 

Se criteri_ricerca = 'abc', tornerà dati contenenti xxxabcxxxx che va bene.

Ma se il mio search_criteria = 'abc%', restituirà comunque i dati contenenti xxxabcxxx, che non dovrebbe essere il caso.

Come posso gestire questa situazione?

+1

allora perché aggiungere la tua%? – Randy

+0

quale linguaggio di programmazione stai usando? – Jeshurun

+0

linguaggio di programmazione = C# – pratik

risposta

22

MS-SQL; Se vuoi che il simbolo search_criteria in search_criteria sia interpretato come un carattere letterale anziché come carattere jolly, sfuggire a [%];

.... where name like '%' + replace(search_criteria, '%', '[%]') + '%' 
+1

grazie, dà una colonna con il segno% 'select * da tablename dove Column come '% [%]%'' – stom

+0

meravigliosa risposta .... Grazie. – User

2
Select * from table where name like search_criteria 

se vi aspettate all'utente di aggiungere i propri caratteri jolly ...

0

fuga il segno di percentuale \% per renderlo parte della vostra valore di confronto.

+0

Funziona solo se si utilizza l'opzione 'ESCAPE' dell'operatore' LIKE'. Non esiste un carattere di escape predefinito (in SQL Server, comunque). –

2

È necessario evitarlo: in molti database questo viene fatto facendolo precedere da barra rovesciata, \%.

Quindi abc diventa abc\%.

Il tuo linguaggio di programmazione avrà una funzione specifica del database per farlo. Ad esempio, PHP ha mysql_escape_string() per il database MySQL.

7

Utilizzare una clausola di salvaguardia:

select * 
    from (select '123abc456' AS result from dual 
     union all 
     select '123abc%456' AS result from dual 
     ) 
    WHERE result LIKE '%abc\%%' escape '\' 

Risultato

123abc%456 

È possibile impostare il carattere di escape per quello che vuoi. In questo caso, il predefinito '\'. L'escape '\%' diventa letterale, il secondo '%' non è sfuggito, quindi di nuovo wild card.

Vedi List of special characters for SQL LIKE clause

10

La soluzione più semplice è di fare a meno "come" del tutto:

Select * 
from table 
where charindex(search_criteria, name) > 0 

preferisco charIndex su come. Storicamente, ha avuto prestazioni migliori, ma non sono sicuro che ora faccia molta differenza.

+0

Mi piace molto questa risposta, in quanto chiaramente non è vulnerabile a SQL Injection, in quanto hai evitato la concatenazione delle stringhe. – StuartQ

+0

controllare [sql-server-performance] (http://www.sql-server-performance.com/forum/threads/charindex-vs-like.16120/) per un confronto breve v. Nota che l'uso di 'like 'findme%'' può ancora usare un indice se esiste. –

0

Può essere questo un aiuto :)

DECLARE @SearchCriteria VARCHAR(25) 
SET @SearchCriteria = 'employee' 
IF CHARINDEX('%', @SearchCriteria) = 0 
BEGIN 
SET @SearchCriteria = '%' + @SearchCriteria + '%' 
END 
SELECT * 
FROM Employee 
WHERE Name LIKE @SearchCriteria 
4

Per sfuggire un carattere in SQL è possibile utilizzare !:


ESEMPIO - UTILIZZO caratteri di escape

E 'importante per capire come "Escape Characters" quando si abbina il modello. Questi esempi riguardano specificamente i caratteri di escape in Oracle.

Supponiamo di voler cercare un carattere% o un carattere _ nella condizione SQL LIKE. Puoi farlo usando un personaggio di fuga.

Si noti che è possibile definire un carattere di escape solo come carattere singolo (lunghezza 1).

Ad esempio:

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE '!%' escape '!'; 

Questa SQL LIKE condizione esempio identifica la! personaggio come personaggio di fuga. Questa dichiarazione restituirà tutti i fornitori il cui nome è%.

Ecco un altro esempio più complicato utilizzando i caratteri di escape nella condizione SQL LIKE.

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE 'H%!%' escape '!'; 

Questo esempio di condizione SQL LIKE restituisce tutti i fornitori il cui nome inizia con H e termina in%. Ad esempio, restituirebbe un valore come "Hello%".

È inoltre possibile utilizzare il carattere di escape con il carattere _ nella condizione SQL LIKE.

Ad esempio:

SELECT * 
FROM suppliers 
WHERE supplier_name LIKE 'H%!_' escape '!'; 

Questa SQL LIKE condizione di esempio restituisce tutti i fornitori il cui nome inizia con H e finisce in _. Ad esempio, restituirebbe un valore come "Hello_".


Riferimento: sql/like