T-SQL i klauzula WHERE LIKE% Parameter%

84

Próbowałem napisać instrukcję, która używa klauzuli WHERE LIKE „% text%”, ale nie otrzymuję wyników, gdy próbuję użyć parametru dla tekstu. Na przykład to działa:

SELECT Employee WHERE LastName LIKE '%ning%'

Spowoduje to zwrócenie użytkowników Flenning, Manning, Ningle itp. Ale to stwierdzenie nie:

DECLARE @LastName varchar(max)
SET @LastName = 'ning'
SELECT Employee WHERE LastName LIKE '%@LastName%'

Nie znaleziono wyników. Jakieś sugestie? Z góry dziękuję.

dp3
źródło

Odpowiedzi:

161

Powinno być:

...
WHERE LastName LIKE '%' + @LastName + '%';

Zamiast:

...
WHERE LastName LIKE '%@LastName%'
Mahmoud Gamal
źródło
1
dzięki za wcześniejszą wskazówkę na pytanie. Ale tak nie było. W każdym razie w poszukiwaniu odpowiedzi o wysokiej skuteczności - czy jest to przydatne, czy nie? :)
bonCodigo
1
@bonCodigo Naprawdę nie wiem, wydajność i optymalizacja to nie moja dziedzina. Co więcej, te funkcje są specyficzne dla dostawcy, w twoim przypadku zależy to od tego, jak Oracle RDBMS je ocenia, a ja nie znam Oracle. Przepraszam.
Mahmoud Gamal,
3
To nie zadziałało dla mnie. % Musi znajdować się w sekcji addParameter. Zobacz odpowiedź Jamesa Currana tutaj stackoverflow.com/questions/251276/ ...
bendecko
2
zobacz moją odpowiedź (obecnie poniżej). symbol wieloznaczny jest CZĘŚCIĄ wyrażenia SEARCH, a nie częścią zapytania sql. Jest wprowadzany przez UŻYTKOWNIKA (lub, jeśli wyszukiwanie za pomocą symboli wieloznacznych jest wstępnie zdefiniowane, jest dołączany do wpisanego wyrażenia wyszukiwania użytkownika). Jeśli dołączysz go przez konkatanację ciągów na poziomie bazy danych, otrzymasz ciąg zapytania, którego nie można użyć
swe
16

Prawidłowa odpowiedź jest taka, że ​​ponieważ '%'-sign jest częścią wyrażenia wyszukiwania, powinien być częścią WARTOŚCI, więc gdziekolwiek SET @LastName(czy to z języka programowania, czy z TSQL), powinieneś ustawić go na'%' + [userinput] + '%'

lub w Twoim przykładzie:

DECLARE @LastName varchar(max)
SET @LastName = 'ning'
SELECT Employee WHERE LastName LIKE '%' + @LastName + '%'
swe
źródło
9

możesz spróbować tego, używanego CONCAT

WHERE LastName LIKE Concat('%',@LastName,'%')
Ramgy Borja
źródło