共計 3325 個字符,預計需要花費 9 分鐘才能閱讀完成。
今天就跟大家聊聊有關 SqlServer 如何使用 case when 解決多條件模糊查詢問題,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
我們在進行項目開發中,經常會遇到多條件模糊查詢的需求。對此,我們常見的解決方案有兩種:一是在程序端拼接 SQL 字符串,根據是否選擇了某個條件,構造相應的 SQL 字符串;二是在數據庫的存儲過程中使用動態的 SQL 語句。其本質也是拼接 SQL 字符串,不過是從程序端轉移到數據庫端而已。
這兩種方式的缺點是顯而易見的:一是當多個條件每個都可為空時,要使用多個 if 語句進行判斷;二是拼接的 SQL 語句容易產生 SQL 注入漏洞。
最近寫數據庫存儲過程的時候經常使用 case when 語句,正好可以用這個語句解決一下以上問題。以 SQL 中的 NorthWind 數據庫為例,我要操作的是其中的 Employees 表,該表中默認數據如下:
使用如下腳本來查詢表中數據:
代碼
DECLARE @FirstName NVARCHAR(), @LastName NVARCHAR(); SELECT @FirstName = , @LastName = SELECT * FROM Employees c WHERE CHARINDEX( ( CASE WHEN @FirstName = THEN FirstName ELSE @FirstName END ), FirstName ) AND CHARINDEX( (CASE WHEN @LastName = THEN LastName ELSE @LastName END), LastName )
執行后會發現查出的結果和圖 1 一樣。
我們把第二行的 @FirstName 變量賦值為 n 試試,會把所有 FirstName 字段中包含字符串 n 的記錄查出來,如下圖:
如果我們再把第三行的 @LastName 變量賦值為 d 試試,結果會把所有 FirstName 字段包含 n 并且 LastName 字段包含 d 的記錄查出來,如下圖:
通過以上例子我們可以看到,通過給兩個變量傳遞不同的值,就可以根據多條件進行模糊查詢了,如果把上面的語句寫在存儲過程中,就可以不必再拼接 SQL 語句了,也不會出現注入式問題了。
以上腳本的簡單說明:用 charindex 函數替換 like,避免拼接 sql 語句;使用 case when 語句,當傳遞的參數值為空字符串時讓條件始終為真,即等于忽略該條件,不為空串時按參數值模糊查詢。
以上是工作中的經驗總結,希望對大家有幫助。有關 case when 還有一些比較實用的用法,有時間的話再寫寫。
下面給大家介紹 SQL CASE 多條件用法
Case 具有兩種格式。簡單 Case 函數和 Case 搜索函數。
-- 簡單 Case 函數 CASE sex WHEN THEN 男 WHEN THEN 女 ELSE 其他 END--Case 搜索函數 CASE WHEN sex = THEN 男 WHEN sex = THEN 女 ELSE 其他 END
這兩種方式,可以實現相同的功能。簡單 Case 函數的寫法相對比較簡潔,但是和 Case 搜索函數相比,功能方面會有些限制,比如寫判斷式。
還有一個需要注意的問題,Case 函數只返回第一個符合條件的值,剩下的 Case 部分將會被自動忽略。
– 比如說,下面這段 SQL,你永遠無法得到“第二類”這個結果
CASE WHEN col_ IN ( a , b) THEN 第一類 WHEN col_ IN (a) THEN 第二類 ELSE 其他 END
下面我們來看一下,使用 Case 函數都能做些什么事情。
一,已知數據按照另外一種方式進行分組,分析。
有如下數據:(為了看得更清楚,我并沒有使用國家代碼,而是直接用國家名作為 Primary Key)
國家(country)人口(population)
中國
美國
加拿大
英國
法國
日本
德國
墨西哥
印度
根據這個國家人口數據,統計亞洲和北美洲的人口數量。應該得到下面這個結果。
洲 人口
亞洲
北美洲
其他
想要解決這個問題,你會怎么做?生成一個帶有洲 Code 的 View,是一個解決方法,但是這樣很難動態的改變統計的方式。
如果使用 Case 函數,SQL 代碼如下:
SELECT SUM(population), CASE country WHEN 中國 THEN 亞洲 WHEN 印度 THEN 亞洲 WHEN 日本 THEN 亞洲 WHEN 美國 THEN 北美洲 WHEN 加拿大 THEN 北美洲 WHEN 墨西哥 THEN 北美洲 ELSE 其他 ENDFROM Table_AGROUP BY CASE country WHEN 中國 THEN 亞洲 WHEN 印度 THEN 亞洲 WHEN 日本 THEN 亞洲 WHEN 美國 THEN 北美洲 WHEN 加拿大 THEN 北美洲 WHEN 墨西哥 THEN 北美洲 ELSE 其他 END;
同樣的,我們也可以用這個方法來判斷工資的等級,并統計每一等級的人數。SQL 代碼如下;
SELECT CASE WHEN salary = THEN WHEN salary AND salary = THEN WHEN salary AND salary = THEN WHEN salary AND salary = THEN ELSE NULL END salary_class, COUNT(*)FROM Table_AGROUP BY CASE WHEN salary = THEN WHEN salary AND salary = THEN WHEN salary AND salary = THEN WHEN salary AND salary = THEN ELSE NULL END;
二,用一個 SQL 語句完成不同條件的分組。
有如下數據
國家(country)性別(sex)人口(population)
中國
中國
美國
美國
加拿大
加拿大
英國
英國
按照國家和性別進行分組,得出結果如下
國家 男 女
中國
美國
加拿大
英國
普通情況下,用 UNION 也可以實現用一條語句進行查詢。但是那樣增加消耗 (兩個 Select 部分),而且 SQL 語句會比較長。
下面是一個是用 Case 函數來完成這個功能的例子
SELECT country, SUM( CASE WHEN sex = THEN population ELSE END), -- 男性人口 SUM( CASE WHEN sex = THEN population ELSE END) -- 女性人口 FROM Table_AGROUP BY country;
這樣我們使用 Select,完成對二維表的輸出形式,充分顯示了 Case 函數的強大。
三,在 Check 中使用 Case 函數。
在 Check 中使用 Case 函數在很多情況下都是非常不錯的解決方法??赡苡泻芏嗳烁揪筒挥?Check,那么我建議你在看過下面的例子之后也嘗試一下在 SQL 中使用 Check。
下面我們來舉個例子
公司 A,這個公司有個規定,女職員的工資必須高于塊。如果用 Check 和 Case 來表現的話,如下所示
CONSTRAINT check_salary CHECK ( CASE WHEN sex = THEN CASE WHEN salary THEN ELSE END ELSE END = )
如果單純使用 Check,如下所示
CONSTRAINT check_salary CHECK ( sex = AND salary )
女職員的條件倒是符合了,男職員就無法輸入了。
我的一個示例:br SELECT (CASE WHEN t.name= name THEN ok ELSE no END) AS myCom, jname FROM t br 定義一個新的字段,此字段用來顯示字段結果的不同顯示結果,似于 switch…case
看完上述內容,你們對 SqlServer 如何使用 case when 解決多條件模糊查詢問題有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。