我們在進行專案開發中,經常會遇到多條件模糊查詢的需求。對此,我們常見的解決方案有兩種:一是在程式端拼接sql字串,根據是否選擇了某個條件,構造相應的sql字串;二是在資料庫的儲存過程中使用動態的sql語句。其本質也是拼接sql字串,不過是從程式端轉移到資料庫端而已。
這兩種方式的缺點是顯而易見的:一是當多個條件每個都可為空時,要使用多個if語句進行判斷;二是拼接的sql語句容易產生sql注入漏洞。
最近寫資料庫儲存過程的時候經常使用case when 語句,正好可以用這個語句解決一下以上問題。以sql中的northwind資料庫為例,我要操作的是其中的employees表,該表中預設資料如下:
使用如下指令碼來查詢表中資料:
**
1執行後會發現查出的結果和圖1一樣。declare
@firstname
nvarchar(10
),2@lastname
nvarchar(20
);3select
@firstname=''
,4@lastname=''
;5select*6
from
employees c
7where
charindex(8
(9case
10when
@firstname=''
then
firstname
11else
@firstname
12end
13),
14firstname
15)
>016
andcharindex(17
(case
when
@lastname=''
then
lastname
else
@lastname
end),
18lastname
19)
>
0
我們把第二行的@firstname變數賦值為'n'試試,會把所有firstname欄位中包含字串'n'的記錄查出來,如下圖:
如果我們再把第三行的@lastname變數賦值為'd'試試,結果會把所有firstname欄位包含'n'並且lastname欄位包含'd'的記錄查出來,如下圖:
通過以上例子我們可以看到,通過給兩個變數傳遞不同的值,就可以根據多條件進行模糊查詢了,如果把上面的語句寫在儲存過程中,就可以不必再拼接sql語句了,也不會出現注入式問題了。
以上指令碼的簡單說明:用charindex函式替換like,避免拼接sql語句;使用case when 語句,當傳遞的引數值為空字串時讓條件始終為真,即等於忽略該條件,不為空串時按引數值模糊查詢。
以上是工作中的經驗總結,希望對大家有幫助。有關case when還有一些比較實用的用法,有時間的話再寫寫。
關於CASE WHEN的多條件彙總問題
問題 建立測試表 if exists select from sys.objects where object id object id n dbo tb and type in n u drop table dbo tb1 gocreate table dbo tb1 卡狀態 nvarchar 2...
多條件游標更新 變CASE WHEN更新法提高速度
定義個結構體陣列 type ty parmeter is record v hezuotype number 1 v comefrom varchar2 50 v regchannel varchar2 50 v newchannel nvarchar2 30 type ty parmeter ta...
case when 批量條件處理
case具有兩種格式。簡單case函式和case搜尋函式。簡單 case函式 case when 1 then 男 when 2 then 女 else 其他 end case 搜尋函式 case when 1 then 男 when 2 then 女 else 其他 end 如果是滿足判斷條件 u...