簡體   English   中英

SQL:在WHERE中使用OR的情況

[英]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.

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