Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 where от параметра  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
помогите пожалуйста реализовать запрос от двух параметров
оба параметра строковые

имею две джоиненые таблицы

select 
*
from TPerson p
join TTabel t
on p.id = t.id
where (
      (@tabel = '%' and @fam <> '%' and p.fam like @fam)
      or 
      (@tabel <> '%' and @fam = '%' and t.tabel like @tabel)
      or
      (@tabel <> '%' and @fam <> '%' and t.tabel like @tabel and p.fam = @fam)
          )

такой запрос выполняется гораздо дольше, если я знаю какой конкретно параметр передается, тогда можно от некоторых веток в фильтре отказаться, но тогда придется несколько раз клонировать тело запроса с разными фильтрами, это не очень красиво.
пытался сделать СТЕ, но после объявленной СТЕ, не рабоают if для организации веток.

подскажите как можно увеличить быстродействие моего запроса?
1 фев 12, 10:15    [12009125]     Ответить | Цитировать Сообщить модератору
 Re: where от параметра  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
where t.tabel like @tabel and p.fam like @fam
чем не подходит?
Разве что может быть t.tabel IS NULL или p.fam like @fam
Тогда чуть сложнее
1 фев 12, 10:24    [12009173]     Ответить | Цитировать Сообщить модератору
 Re: where от параметра  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Опечатка
iap
where t.tabel like @tabel and p.fam like @fam
чем не подходит?
Разве что может быть t.tabel IS NULL или p.fam IS NULL
Тогда чуть сложнее
1 фев 12, 10:25    [12009180]     Ответить | Цитировать Сообщить модератору
 Re: where от параметра  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
Быстрей работает если делать так


if @tabel = '%'
begin
select 
*
from TPerson p
join TTabel t
on p.id = t.id
where p.fam like @fam
end

if @fam = '%'
begin
select 
*
from TPerson p
join TTabel t
on p.id = t.id
where t.tabel like @tabel
end


но это не красиво, тут то я написал в качестве примера, кратенький скриптик, у меня то ясен пень что скрипт сложнее...

iap
t.tabel IS NULL или p.fam IS NULL

имеет место быть
1 фев 12, 10:41    [12009266]     Ответить | Цитировать Сообщить модератору
 Re: where от параметра  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
WHERE (@tabel='%' OR t.tabel LIKE @tabel) AND (@fam ='%' OR p.fam LIKE @fam)
1 фев 12, 11:09    [12009473]     Ответить | Цитировать Сообщить модератору
 Re: where от параметра  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
iap
WHERE (@tabel='%' OR t.tabel LIKE @tabel) AND (@fam ='%' OR p.fam LIKE @fam)


к сожалению не дает нужного результата, по обоим полям есть индексы, и в розь данные ищутся быстро, медленно если в джоине и параметры имеют комбинации поочердно маску.
1 фев 12, 12:27    [12010199]     Ответить | Цитировать Сообщить модератору
 Re: where от параметра  [new]
Aleksey V.P.
Member

Откуда: Москва
Сообщений: 575
Двоичник,

Динамический SQL. Сначала составляешь запрос на основе шаблонов и анализа параметров, потом выполняешь.
1 фев 12, 13:41    [12011141]     Ответить | Цитировать Сообщить модератору
 Re: where от параметра  [new]
ZOOKABAKODER
Member

Откуда:
Сообщений: 178
Двоичник
но это не красиво, тут то я написал в качестве примера, кратенький скриптик, у меня то ясен пень что скрипт сложнее...

Это SQL, парень, тут всё некрасиво. :-)

Можно на t4 сгенерить хранимок и вызывать их из основной через if, всё будет красиво. Но t4 шаблон может быть не очень презентабельным.
1 фев 12, 14:29    [12011798]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить