Несколько условий в предложении WHERE - PullRequest
3 голосов
/ 13 сентября 2011

Я должен передать параметр в условие для выбора строк, если я передам 0, он должен выбрать все строки, 1 - только HDD, 2 - Все, кроме HDD

Пожалуйста, смотрите код:

declare @Accessories table (id int, name nvarchar(20), atype nvarchar(20), itype int)

insert into @Accessories values (1, 'Seagate HDD 100GB', 'HDD', 1)
insert into @Accessories values (2, 'Samsung HDD 100GB', 'HDD', 1)
insert into @Accessories values (3, 'WD HDD 500GB', 'HDD', 1)
insert into @Accessories values (4, 'Samsung 4GB', 'RAM', 2)
insert into @Accessories values (5, 'GeForce 512MB', 'Video', 3)

declare @param int

set @param = 1 /* 0 - All records, 1 - Only HDD, 2 - All exclude HDD */

select 
    * 
from @Accessories
where itype = @param /* NEED RIGHT CONDITION HERE*/

Я не могу написать код, например, если @param = 0, то ... Можно ли написать условие в выражении WHERE?

Спасибо!

Ответы [ 3 ]

8 голосов
/ 13 сентября 2011

Вы можете использовать что-то вроде этого:

select * 
from @Accessories 
where (@Param = 0)
  or (@Param = 1 and atype = 'HDD') 
--or (@Param = 1 and itype = 1) , if itype and atype are connected
  or (@Param = 2 and atype != 'HDD')
option (recompile)

Если Param равен 0, первое условие становится 0=0 и соответствует для всех строк, поэтому возвращаются все строки. Если параметр равен 1 или 2, то только первое или ветвь соответствует первому условию, поэтому он возвращает то, что указывает второе условие.

Кроме того, option (recompile) действительно важен (см. Статью в комментарии Мартина). Он указывает серверу SQL использовать значения параметров времени выполнения при подготовке плана выполнения, поэтому в основном:

  • при @Param = 0 запрос становится select * from @Accessories
  • когда @Param = 1, запрос становится select * from @Accessories where atype = 'HDD'
  • когда @Param = 2, запрос становится select * from @Accessories where atype != 'HDD'
2 голосов
/ 13 сентября 2011
WHERE itype BETWEEN @param AND CASE 
    WHEN @param = 1 THEN 1
    ELSE 2000000000 END
OPTION (RECOMPILE); -- thanks for the reminder @Martin
0 голосов
/ 13 сентября 2011
declare @Accessories table (id int, name nvarchar(20), atype nvarchar(20))

insert into @Accessories values (1, 'Seagate HDD 100GB', 'HDD')
insert into @Accessories values (2, 'Samsung HDD 100GB', 'HDD')
insert into @Accessories values (3, 'WD HDD 500GB', 'HDD')
insert into @Accessories values (4, 'Samsung 4GB', 'RAM')
insert into @Accessories values (5, 'GeForce 512MB', 'Video')

declare @param int

set @param = 0 /* 0 - All records, 1 - Only HDD, 2 - All exclude HDD */

if(@param =0)
begin
select * from @Accessories
end
if(@param =1)
begin
select * from @Accessories where atype in ('HDD')
end
if(@param =2)
begin
select * from @Accessories where atype not in('HDD')
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...