2012-05-29 9 views
26

Mam zapytanie SQL jak poniżej.Zapytanie SQL 'LIKE' z '%', gdzie kryteria wyszukiwania zawierają '%'

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

Jeśli kryteria_wyszukiwania = 'abc', zwróci dane zawierające xxxabcxxxx który jest w porządku.

Ale jeśli moje search_criteria = "abc%", nadal będzie zwracać dane zawierające xxxabcxxx, co nie powinno mieć miejsca.

Jak sobie z tym poradzić?

+1

dlaczego dodać własną%? – Randy

+0

jakiego języka programowania używasz? – Jeshurun

+0

język programowania = C# – pratik

Odpowiedz

22

MS-SQL; Jeśli chcesz, aby symbol % w postaci search_criteria był traktowany jako znak literowy, a nie jako symbol wieloznaczny, unikaj go do [%];

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

dziękuję, daje kolumnę z% znakiem 'wybierz * od nazwy tabeli, gdzie kolumna taka jak"% [%]% '' – stom

+0

wspaniała odpowiedź .... Dzięki. – User

2
Select * from table where name like search_criteria 

jeśli spodziewasz użytkownikowi dodawać własne symbole wieloznaczne ...

0

Ucieczka znak procent \% aby część swojej wartości porównawczej.

+0

Działa to tylko w przypadku użycia opcji 'ESCAPE' operatora' LIKE'. Nie ma domyślnego znaku escape (w SQL Server, tak). –

2

Musisz uciec z tego: w wielu bazach danych odbywa się to poprzez poprzedzanie go ukośnikiem odwrotnym, \%.

Tak więc staje się abc\%.

Twój język programowania będzie zawierał funkcję specyficzną dla bazy danych, która zrobi to za ciebie. Na przykład PHP ma mysql_escape_string() dla bazy danych MySQL.

7

pomocą klauzuli ucieczki:

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

Wynik

123abc%456 

można ustawić znak escape aby cokolwiek chcesz. W tym przypadku domyślny "\". Zmienna "% \" staje się literalna, druga "%" nie jest uciekła, więc znowu dzika karta.

Zobacz List of special characters for SQL LIKE clause

10

Najprostszym rozwiązaniem jest zrezygnowanie z "jak" całkowicie:

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

Wolę CHARINDEX nad niczym. Historycznie, miał lepszą wydajność, ale nie jestem pewien, czy teraz ma to duże znaczenie.

+0

Naprawdę podoba mi się ta odpowiedź, ponieważ wyraźnie nie jest podatna na SQL Injection, ponieważ unikałeś łączenia się ciągów. – StuartQ

+0

sprawdź [sql-server-performance] (http://www.sql-server-performance.com/forum/threads/charindex-vs-like.16120/) dla krótkiego porównania v. Zauważ, że użycie 'like 'findme%'' może nadal używać indeksu, jeśli istnieje. –

0

Może być to jeden help :)

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

Aby uciec znak w SQL można używać !:


przykład - KORZYSTANIA znaczenia znaków

Ważne jest aby zrozumieć, jak "Escape Characters" podczas dopasowywania wzorca. Te przykłady dotyczą w szczególności ucieczki postaci w Oracle.

Załóżmy, że chcesz wyszukać znak% lub _ w warunku SQL LIKE. Możesz to zrobić za pomocą znaku Escape.

Należy pamiętać, że znak escape można zdefiniować tylko jako pojedynczy znak (długość 1).

Na przykład:

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

Ten SQL LIKE przykład stan identyfikuje! postać jako znak ucieczki. To oświadczenie zwróci wszystkich dostawców, których nazwa to%.

Oto kolejny, bardziej skomplikowany przykład wykorzystujący znaki escape w warunku SQL LIKE.

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

Ten przykład warunku SQL LIKE zwraca wszystkich dostawców, których nazwa zaczyna się od H i kończy na%. Na przykład zwróci wartość taką jak "Witaj%".

Można również użyć znaku escape z znakiem _ w warunku SQL LIKE.

Na przykład:

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

Ten SQL LIKE przykład stan powraca wszystkich dostawców, których nazwa zaczyna się i kończy w H _. Na przykład zwróci wartość taką jak "Hello_".


referencyjny: sql/like