Zmienna we wzorze LIKE '%%' [MS SQL Server 2014]

Zmienna we wzorze LIKE '%%' [MS SQL Server 2014]
KA
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 7 lat
  • Postów:4
0

Witam

Czy jest jakiś sposób, aby w klauzuli LIKE umieścić zmienną i wyszukiwać tekst, gdzie zawartość zmiennej będzie częścią całości? Chodzi mi wzór LIKE '%szukanytekst%'?

Niżej to co przeszło mi do głowy, ale nie działa:

declare @word as varchar(250)
set @word = N'firma'

select nazwa, adres
from firmy
where nazwa LIKE '%@word%'

Jakieś pomysły jak to zrobić?

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 7 godzin
  • Postów:3876
2
Kopiuj
declare @word as varchar(250)
set @word = N'firma'

select nazwa, adres
from firmy
where nazwa LIKE '%'+@word+'%'
PD
po co używasz prefiksu N przed ciągiem znaków, jeżeli i tak zdefiniowałeś zmienną jako VARCHAR
abrakadaber
abrakadaber
pewnie skopiował z kodu pytacza
PA
Dokładnie jak pisał @abrakadaber skopiowałem z posta, nie jest tam w ogóle potrzebny
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
1

BTW wiesz, że takie wyszukiwanie jest najgorszym z możliwych


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
BlackBad
@abrakadaber: please rozwiń myśl bo sam jestem bardzo zainteresowany czemu "najgorszy" ? Chodzi o zmienną ? Czy już samo szukanie ? Jak było by najlepiej ? Z góry dzięki za info.
KA
Zastosowałem ten sposób, żeby wyszukiwać ID firm których zmienna zawiera się w nazwie i następnie wykorzystać te ID, żeby dotrzeć do innych tabel powiązanych z ID tych firm. Nie chodziło mi tu o wyszukanie dokładnie jednej z firm, a to o co pytałem wydało mi się najprostszym sposobem.
abrakadaber
abrakadaber
@BlackBad: bo to wyszukiwanie po pierwsze nie korzysta z indeksów a po drugie %aa% musi sprawdzić każdy dwuliterowy podciąg z danej kolumny (chyba, że wcześniej znajdzie pasującą wartość). O ile np. aa% potrafi korzystać z indeksów to %aa% nie ma takiej możliwości. Przy takich wymaganiach korzysta się z wyszukiwania pełnotekstowego.
BlackBad
@abrakadaber: Dzięki za wyjaśnienie.
KA
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 7 lat
  • Postów:4
0
Panczo napisał(a):
Kopiuj
declare @word as varchar(250)
set @word = N'firma'

select nazwa, adres
from firmy
where nazwa LIKE '%'+@word+'%'

Działa, dzięki.

Mam jeszcze jedno pytanie.

Prefiks "N" dodałem, żeby wyszukiwać również polskie znaki. W zwykłym warunku 'WHERE nazwa LIKE '%firma%' prefiks był niezbędny. Jak to zastosować również do zmiennej?

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 7 godzin
  • Postów:3876
0

Jakiego typu jest kolumna nazwa w tabeli firmy?
Jakie collation ma serwer, a jakie baza?

Generalnie prefix N powodouje tylko, ze string będzie konwertowany do Unicode

KA
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 7 lat
  • Postów:4
0
Panczo napisał(a):

Jakiego typu jest kolumna nazwa w tabeli firmy?
Jakie collation ma serwer, a jakie baza?

Generalnie prefix N powodouje tylko, ze string będzie konwertowany do Unicode

Typ kolumny to nvarchar.
Collation bazy i servera to SQL_Latin1_General_CP1_CI_AS

Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:8 dni
  • Postów:2792
1

Zmień deklarację:

Kopiuj
DECLARE @word AS NVARCHAR(250)
PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 7 godzin
  • Postów:3876
1

No to wiele wyjaśnia collation "nie obsługuje" domyslnie polskich znaków, chyba że sie myle i znajdziesz je tutaj: https://msdn.microsoft.com/en-us/library/cc195054.aspx

Teraz prosty test, który da ci odpowiedź na to dlaczego nie działały polskie znaczki:

Kopiuj

DECLARE @zN  VARCHAR(250) = N'ęóąśłżźćń' collate SQL_Latin1_General_CP1_CI_AS 
DECLARE @bezN  VARCHAR(250) = 'ęóąśłżźćń' collate SQL_Latin1_General_CP1_CI_AS 

select @zN, @bezN

Wynik:

@zN @bezN
ęóąśłżźćń eóaslzzcn

I jak pisał @Marcin.Miga używaj typów zgodnych z kolumna w bazie

KA
  • Rejestracja:prawie 8 lat
  • Ostatnio:około 7 lat
  • Postów:4
0

Ok, dzięki za pomoc.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.