如何使用參數方式篩選bit型態欄位為true、false或全部的資料

如何使用參數方式篩選bit型態欄位為true、false或全部的資料

假設table的定義如下:

   1:  declare @t table (c1 bit,c2 varchar(10))
   2:  insert into @t values (1,'A'),(0,'B'),(1,'C'),(0,'D'),(1,'E')
   3:  
   4:  select *
   5:  from @t

image

若前端AP想要針對c1欄位篩選,讓使用者選擇針對c1為true、false或全部(即不做任何過濾),最簡單就是寫三段不同的TSQL敘述,已產生下列結果。

  • 只篩選c1為false。
   1:  select *
   2:  from @t
   3:  where c1 = 0

image
  • 只篩選c1為true。
   1:  select *
   2:  from @t
   3:  where c1 = 1

image
  • 顯示全部資料
   1:  select *
   2:  from @t

image

上述做法雖然簡單易懂,但實務上若遇到需要進行複雜的join或是更多運算恐怕寫三套TSQL就不是最好的做法,本文提供一個使用case when敘述搭配衍生資料表的方式來整合上面三段TSQL敘述,完整程式碼如下:

 

   1:  declare @t table (c1 bit,c2 varchar(10))
   2:  insert into @t values (1,'A'),(0,'B'),(1,'C'),(0,'D'),(1,'E')
   3:  
   4:  select *
   5:  from @t
   6:  where c1 = 1
   7:  
   8:  declare @flag bit = 1 --只取出c1為true的資料
   9:  --declare @flag bit = 0 --只取出c1為false的資料
  10:  --declare @flag bit = null --取出所有資料,相當於不過濾
  11:  
  12:  if @flag = '' set @flag = null
  13:  select c1,c2
  14:  from (
  15:          select c1,c2,case when c1 = 0 and @flag is not null then '0'
  16:                         when c1 = 1 and @flag is not null then '1'
  17:                         else '2' 
  18:                         end as flag 
  19:          from @t 
  20:       ) t
  21:  where flag = case when @flag = 0 then '0'
  22:                    when @flag = 1 then '1'
  23:                    else '2'
  24:               end

PS:各位先進若有任何建議或更好的方法,歡迎不吝指教,謝謝。