簡體   English   中英

WHERE子句中的多個條件

[英]Multiple conditions in WHERE clause

我必須將一個參數傳遞給一個條件來選擇行,如果我傳遞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語句中寫入條件?

謝謝!

你可以使用這樣的東西:

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並匹配所有行,因此返回所有行。 如果param為1或2,則只有相應或分支在第一個條件上匹配,因此它返回第二個條件指定的內容。

此外, option (recompile)非常重要(查看Martin評論中的文章)。 它指示SQL Server在准備執行計划時使用參數的運行時值,所以基本上:

  • 當@Param = 0時,查詢select * from @Accessories變為select * from @Accessories
  • 當@Param = 1時,查詢select * from @Accessories where atype = 'HDD'
  • 當@Param = 2時,查詢變為select * from @Accessories where atype != 'HDD'
WHERE itype BETWEEN @param AND CASE 
    WHEN @param = 1 THEN 1
    ELSE 2000000000 END
OPTION (RECOMPILE); -- thanks for the reminder @Martin
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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM