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

Откуда: Киев
Сообщений: 1387
Пытаюсь написать ХР

например

CREATE PROCEDURE dbo.Test
	@search bigint = null,
	@search1 bigint = null,
	@search2 bigint = null,
	@search3 bigint = null,
	@search4 bigint = null
as
--много условий if
if (@search is not null)
begin .... end
else if (@search is not null and @search1 is not null)
begin .... end
else if (@search is not null and @search1 is not null and @search2 is not null)
begin .... end
....


Поскажите как можна написать запрос что бы не перебирать параметры

может можна как то организовать эти условия примерно так

CREATE PROCEDURE dbo.Test
	@search bigint = null,
	@search1 bigint = null,
	@search2 bigint = null,
	@search3 bigint = null,
	@search4 bigint = null
as
begin
select * from dbo.Table where 
if (@search is not null) column=@search
if (@search1 is not null) column1=@search1
if (@search2 is not null) column2=@search2
if (@search3 is not null) column3=@search3
if (@search4 is not null) column4=@search4
end


что бы условия фильтрации поместить в where или есть какие то способы попроще?

Спасибо.
23 окт 13, 18:21    [15022574]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
VIT2708,

если в if @search is not null, то и в else это будет по-прежнему так, да?
23 окт 13, 18:48    [15022717]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
iap,

если @search is not null то добавляется в условие выборки

то есть да

я просто не хочу писать 25 конструкций if ... else if.... тупо перебирая все возможные комбинации
23 окт 13, 18:56    [15022754]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Элементарно
Guest
(@search1 is null or column1=@search1) and (@search2 is null or column2=@search2) and ...
?
23 окт 13, 19:02    [15022785]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
VIT2708
iap,

если @search is not null то добавляется в условие выборки

то есть да

я просто не хочу писать 25 конструкций if ... else if.... тупо перебирая все возможные комбинации
Я дико извиняюсь, но в конструкции
if (@search is not null)
begin .... end
else if (@search is not null and @search1 is not null)
if в else либо не будет выполняться, либо никогда не вернёт true.
Потому что случай @search is not null обработает первый if
23 окт 13, 19:27    [15022850]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Элементарно,

Спасибо, похоже, на то что я уже нашел в инете

select *
from TestTable
where column1 like case when isnull(@Variable1,'') = '' then '%' else @Variable1 end
and column2 like case when isnull(@Variable2,'') = '' then '%' else @Variable1 end
and .....
24 окт 13, 09:39    [15024216]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Гость333
Member

Откуда:
Сообщений: 3683
VIT2708
where column1 like case when isnull(@Variable1,'') = '' then '%' else @Variable1 end

Так у вас же в стартовом посте были bigint'ы?
Ну и подумайте, что будет (уже для случая строковых данных), если переменная @Variable1 будет содержать знаки _ или %.
24 окт 13, 10:04    [15024341]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Гость333
VIT2708
where column1 like case when isnull(@Variable1,'') = '' then '%' else @Variable1 end

Так у вас же в стартовом посте были bigint'ы?
Ну и подумайте, что будет (уже для случая строковых данных), если переменная @Variable1 будет содержать знаки _ или %.


А как bigint можна проверить на null?
24 окт 13, 12:33    [15025609]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Гость333
Member

Откуда:
Сообщений: 3683
VIT2708
А как bigint можна проверить на null?

Так, как показано в 15022785?
Правда, при этом не будут использоваться индексы по этим столбцам.
24 окт 13, 12:49    [15025756]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
Гость333
VIT2708
А как bigint можна проверить на null?

Так, как показано в 15022785?
Правда, при этом не будут использоваться индексы по этим столбцам.


а как это можна исправить? потому что этот вариант подходит мне на 100%
24 окт 13, 13:05    [15025917]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
iap
VIT2708
iap,

если @search is not null то добавляется в условие выборки

то есть да

я просто не хочу писать 25 конструкций if ... else if.... тупо перебирая все возможные комбинации
Я дико извиняюсь, но в конструкции
if (@search is not null)
begin .... end
else if (@search is not null and @search1 is not null)
if в else либо не будет выполняться, либо никогда не вернёт true.
Потому что случай @search is not null обработает первый if


ну так там конструкция и дальше с такой же логикой

else if (@search is not null and @search1 is not null)
begin .... end
else if (@search is not null and @search1 is not null and @search2 is not null)
24 окт 13, 13:12    [15025989]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Гость333
Member

Откуда:
Сообщений: 3683
VIT2708
Гость333
Правда, при этом не будут использоваться индексы по этим столбцам.

а как это можна исправить?

Либо дописав в запрос OPTION(RECOMPILE), либо использовать динамический SQL, в который включать только значащие условия (т.е. для которых @search не равен NULL).
24 окт 13, 13:20    [15026062]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Winnipuh
iap
пропущено...
Я дико извиняюсь, но в конструкции
if (@search is not null)
begin .... end
else if (@search is not null and @search1 is not null)
if в else либо не будет выполняться, либо никогда не вернёт true.
Потому что случай @search is not null обработает первый if


ну так там конструкция и дальше с такой же логикой

else if (@search is not null and @search1 is not null)
begin .... end
else if (@search is not null and @search1 is not null and @search2 is not null)
Только логика эта какая-то женская
То есть, отсутствует полностью.
24 окт 13, 14:07    [15026484]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
VIT2708
Member [заблокирован]

Откуда: Киев
Сообщений: 1387
iap
Winnipuh
пропущено...


ну так там конструкция и дальше с такой же логикой

else if (@search is not null and @search1 is not null)
begin .... end
else if (@search is not null and @search1 is not null and @search2 is not null)
Только логика эта какая-то женская
То есть, отсутствует полностью.


Вот по этому и спросил как лучше
24 окт 13, 18:48    [15028265]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
aleks2
Guest
VIT2708
iap
пропущено...
Только логика эта какая-то женская
То есть, отсутствует полностью.


Вот по этому и спросил как лучше


Если "как лучше", то приблизительно так (порядок @searchI надо выбрать @search0 - самый селективный и дальше по нисходящей)

CREATE PROCEDURE dbo.Test
	@search0 bigint = null,
	@search1 bigint = null,
	@search2 bigint = null,
	@search3 bigint = null,
	@search4 bigint = null
as
begin
declare @t table (ID int??? primary key clustered); --int??? = тип  primary key для dbo.Table
declare @f bit = 0;

if @search0 is not null
begin
  if @f = 0
  begin
    set @f = 1;
    insert @t select ID form dbo.Table where column0=@search0
  end
  else
    delete t
       from @t t left outer join (select * from dbo.Table where column0=@search0 ) x on t.ID = x.ID 
       where x.ID is null
end;

if @search1 is not null
begin
  if @f = 0
  begin
    set @f = 1;
    insert @t select ID form dbo.Table where column1=@search1
  end
  else
    delete t
       from @t t left outer join (select * from dbo.Table where column1=@search1 ) x on t.ID = x.ID 
       where x.ID is null
end;

--...

select x.* from dbo.Table x inner join @t t on t.ID = x.ID 
end
25 окт 13, 06:22    [15029433]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите по запросу  [new]
Jaffar
Member

Откуда:
Сообщений: 633
--- так
select *
from t
where
        (@S1 is NULL or Col1 = @S1) 
and     (@S2 is NULL or Col2 = @S2)
and     (@S3 is NULL or Col3 = @S3)
and     (@S4 is NULL or Col4 = @S4)
and     (@S5 is NULL or Col5 = @S5)

--- или так
declare @SQL varchar(max)
select @SQL = 
'select * from Table where 1 = 1 '+
case when @S1 is null then '' else 'and Col1 = '''+cast(@S1 as varchar(32))''''+char(13)+char(10) end+
case when @S2 is null then '' else 'and Col2 = '''+cast(@S2 as varchar(32))''''+char(13)+char(10) end+
case when @S3 is null then '' else 'and Col3 = '''+cast(@S3 as varchar(32))''''+char(13)+char(10) end+
'option(recompile)'

print @SQL
exec(@SQL)
25 окт 13, 07:10    [15029457]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить