巧用case when 解決多條件模糊查詢問題

2022-02-15 07:15:40 字數 1547 閱讀 2370

我們在進行專案開發中,經常會遇到多條件模糊查詢的需求。對此,我們常見的解決方案有兩種:一是在程式端拼接sql字串,根據是否選擇了某個條件,構造相應的sql字串;二是在資料庫的儲存過程中使用動態的sql語句。其本質也是拼接sql字串,不過是從程式端轉移到資料庫端而已。

這兩種方式的缺點是顯而易見的:一是當多個條件每個都可為空時,要使用多個if語句進行判斷;二是拼接的sql語句容易產生sql注入漏洞。

最近寫資料庫儲存過程的時候經常使用case when 語句,正好可以用這個語句解決一下以上問題。以sql中的northwind資料庫為例,我要操作的是其中的employees表,該表中預設資料如下:

使用如下指令碼來查詢表中資料:

**

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

執行後會發現查出的結果和圖1一樣。

我們把第二行的@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...