如何使用參數方式篩選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
若前端AP想要針對c1欄位篩選,讓使用者選擇針對c1為true、false或全部(即不做任何過濾),最簡單就是寫三段不同的TSQL敘述,已產生下列結果。
- 只篩選c1為false。
1: select *
2: from @t
3: where c1 = 0
- 只篩選c1為true。
1: select *
2: from @t
3: where c1 = 1
- 顯示全部資料
1: select *
2: from @t
上述做法雖然簡單易懂,但實務上若遇到需要進行複雜的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:各位先進若有任何建議或更好的方法,歡迎不吝指教,謝謝。