[MS SQl] wyszukiwanie z wieloma parametrami

0

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

0

Sklejaj zapytanie przed wykonaniem. Doklejaj kolejne elementy, jesli tylko uzytkownik je podal. To daje tyle ifow ile parametrow.

0

Dzięki za pomoc. Nie bardzo rozumiem jednak fakt "doklejania" zapytania. Mógłbym prosić o przykład ?

0

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;
}
0

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

0

W procedurze tez mozesz sklejac o odpalac zapytanie po tresci przez exec() ;)

PS. '%'+@Word + '%' jest delikatnie rzecz ujmujac wolne ;)

0

exec ok, dla estetow jest sp_executesql

1 użytkowników online, w tym zalogowanych: 0, gości: 1