2016-12-14 20 views
0

假設存儲過程得到3個參數;這些都是boolean(1或0): @includeMode1@includeMode2@includeMode3SQL:CASE WHEN用或者在

我想這樣做的查詢:

SELECT * 
FROM [dbo].[MyTable] as P 
WHERE P.Mode = 1 (if @includeMode1 = 1) OR P.Mode = 2 (if @includeMode2 = 1) OR P.Mode = 3 (if @includeMode3 = 1) 

我似乎無法找到正確的方法,也很高興聽到是否有更有效的方法(性能)來取代or

+0

關於性能:改進它的唯一機會,就是對'p.mode'和唯一的情況下,指數是否有這些值的持續存在(約)小於20%的行。 –

回答

2

如果所有三可「1」,那麼這樣的:

SELECT * 
FROM [dbo].[MyTable] as P 
WHERE (P.Mode = 1 and @includeMode1 = 1) 
    OR (P.Mode = 2 and @includeMode2 = 1) 
    OR (P.Mode = 3 and @includeMode3 = 1) 
0
SELECT * FROM [dbo].[MyTable] as P 
WHERE P.Mode = CASE WHEN @includeMode1 = 1 THEN 1 ELSE 0 END OR 
    P.Mode = CASE WHEN @includeMode2 = 2 THEN 2 ELSE 0 END OR 
    P.Mode = CASE WHEN @includeMode3 = 3 THEN 3 ELSE 0 END 
0

一種有效的方式來代替or s就使用dynamic sql

rextester:http://rextester.com/RFHEC49942

create procedure [mytable_get_byMode] (@IncludeMode1 bit, @IncludeMode2 bit, @IncludeMode3 bit) as 
begin; 
    if coalesce(nullif(@IncludeMode1,0),nullif(@IncludeMode2,0),nullif(@IncludeMode3,0))=convert(bit,1) 
    begin; 
    declare @sql nvarchar(4000) 
    select @sql =N'select * 
    from [dbo].[MyTable] as P 
    where P.Mode in (' 
    +stuff(case when @IncludeMode1 = 1 then ',1' else '' end 
     +case when @IncludeMode2 = 1 then ',2' else '' end 
     +case when @IncludeMode3 = 1 then ',3' else '' end 
     ,1,1,'') 
     +N');'; 
    select @sql; 
    --exec sp_executesql @sql; 
    end; 
end; 
go 
exec mytable_get_byMode 1,1,1; 
exec mytable_get_byMode 0,1,1; 
exec mytable_get_byMode 1,0,1; 
exec mytable_get_byMode 0,0,0;