首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server CASE WHEN 解決多條件模糊查詢:避免動態 SQL 拼接與注入風險

     編輯:關於SqlServer

場景

前端提供多個可選查詢欄位(如 FirstName、LastName),使用者可任意組合、可留空。傳統做法:

  • 應用層拼接 SQL 字串 → 易注入、難維護。
  • 預存程序動態 SQL → 同樣有注入風險、計畫快取碎片化。

CASE WHEN 靜態化方案

DECLARE @FirstName NVARCHAR(50) = '', @LastName NVARCHAR(50) = '';

SELECT *
FROM Employees
WHERE CHARINDEX(
        CASE WHEN @FirstName = '' THEN FirstName ELSE @FirstName END,
        FirstName
      ) > 0
  AND CHARINDEX(
        CASE WHEN @LastName = '' THEN LastName ELSE @LastName END,
        LastName
      ) > 0;

運作原理

  • 參數為空字串 '' 時,CASE 回傳欄位本身 → CHARINDEX(FirstName, FirstName) 恆 > 0 → 條件恆真(等於忽略該欄位)。
  • 參數有值時,回傳參數值 → CHARINDEX(@val, Column) 進行模糊比對。
  • 整條 SQL 靜態不變,優化器可重用計畫,零注入風險。

測試驗證

@FirstName@LastName結果
''''全表
'n'''FirstName 含 'n'
'n''d'FirstName 含 'n' 且 LastName 含 'd'

單條件結果

雙條件結果

CASE 兩種語法

-- 簡單 CASE(等值判斷)
CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END

-- 搜尋 CASE(任意布林運算式)
CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END

進階應用:動態分組統計

-- 依薪資區間分組統計人數
SELECT
    CASE
        WHEN salary <= 3000 THEN '低'
        WHEN salary > 3000 AND salary <= 6000 THEN '中'
        WHEN salary > 6000 AND salary <= 9000 THEN '高'
        ELSE '極高'
    END AS salary_band,
    COUNT(*) AS cnt
FROM Employees
GROUP BY
    CASE
        WHEN salary <= 3000 THEN '低'
        WHEN salary > 3000 AND salary <= 6000 THEN '中'
        WHEN salary > 6000 AND salary <= 9000 THEN '高'
        ELSE '極高'
    END;

樞紐分析(橫向輸出)

SELECT country,
       SUM(CASE WHEN sex = 'M' THEN population ELSE 0 END) AS male_pop,
       SUM(CASE WHEN sex = 'F' THEN population ELSE 0 END) AS female_pop
FROM CountryPop
GROUP BY country;

CHECK 約束中使用 CASE

CONSTRAINT chk_female_salary CHECK (
    CASE WHEN sex = 'F' THEN CASE WHEN salary > 5000 THEN 1 ELSE 0 END ELSE 1 END = 1
)

注意事項

  • CASE 依序評估,**首個符合條件即返回**,後續分支被忽略。
  • 避免在 CASE 中對大量資料做昂貴運算,必要時改用計算欄位持久化。
  • 搭配 CHARINDEX/LIKE 替代動態 % 拼接,效能更穩定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved