Witam. Chciałbym napisać procedurę wyszukującą dane. Problem polega na tym, że filtrowanie zapytania opiera się o 3 parametry : słowo kluczowe, kategoria i data dodania.
Nie wiem jak obejść problem gdy użytkownik może wpisać w sumie 8 kombinacji. Myślę o tym żeby za pomocą instrukcji if pisać selecta o konkretnej kombinacji parametrów. Ale aż 8 ?
Czy jest jakiś prostszy i lepszy sposób na napisanie takiej procedury ? Będę wdzięczny za jakiś przykład, tym bardziej że kuleję trochę z SQl-a. Z góry dzięki
Sklejaj zapytanie przed wykonaniem. Doklejaj kolejne elementy, jesli tylko uzytkownik je podal. To daje tyle ifow ile parametrow.
Dzięki za pomoc. Nie bardzo rozumiem jednak fakt "doklejania" zapytania. Mógłbym prosić o przykład ?
Pelne zapytanie wyglada na przyklad tak:
select id from tabela where a = 'cos' and b = 'cos2' and c = 'cos3'
Kod sklejajacy PRZED wykonaniem zapytania:
zapytanie = "select id from tabela where ";
dodac_and = false;
if(uzytkownik podal a)
{
dodac_and = dodaj_warunek(zapytanie, "a = wartosc_a ", dodac_and);
}
if(uzytkownik podal b)
{
dodac_and = dodaj_warunek(zapytanie, "b = wartosc_b ", dodac_and);
}
if(uzytkownik podal c)
{
dodac_and = dodaj_warunek(zapytanie, "c = wartosc_c ", dodac_and);
}
...
bool dodaj_warunek(zapytanie, warunek, dodac_and)
{
if(dodac_and)
zapytanie = zapytanie + " and ";
zapytanie = zapytanie + warunek;
return true;
}
Dzięki za pomoc. Nie mniej jednak chciałem to zrobić w procedurze, a sklejanie zapytania mimo że działa wydało mi się mało eleganckie. Poradziłem sobie z tym w taki sposób :
select coś from Coś where
(A.Name like '%'+ @Word +'%' or @word is null) and
(A.RegionID = @Region or @Region is null) and
(A.Date >= @Date or @Date is null)
Raptem 3 linijki w procedurze załatwiają mi 8 różnych kombinacji podawania parametrów :)
Pozdrawiam
W procedurze tez mozesz sklejac o odpalac zapytanie po tresci przez exec() ;)
PS. '%'+@Word + '%' jest delikatnie rzecz ujmujac wolne ;)
exec ok, dla estetow jest sp_executesql