[英]SQL: CASE WHEN with OR in WHERE
假設存儲過程獲取3個均為boolean
(1或0)的參數: @includeMode1
, @includeMode2
, @includeMode3
我想查詢:
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
如果所有三個都可以為“ 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)
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
替換or
的一種有效方法是使用dynamic sql
。
extrester: 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.