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

SQL 多條件動態查詢三大寫法比較:IF 分支、動態 SQL、邏輯合併

     編輯:關於SqlServer

面對多個可選查詢條件(如日期、姓名),常見三種實作模式:分支判斷、動態拼接、邏輯合併。本文比較優劣並推薦最佳寫法。

場景設定

  • 參數:@addDate(日期)、@name(姓名)
  • 兩參數皆可為 NULL 或空字串

寫法一:IF-ELSE 全排列分支(不推薦)

IF @addDate IS NOT NULL AND @name <> ''
    SELECT * FROM tbl WHERE addDate = @addDate AND name = @name
ELSE IF @addDate IS NOT NULL AND @name = ''
    SELECT * FROM tbl WHERE addDate = @addDate
ELSE IF @addDate IS NULL AND @name <> ''
    SELECT * FROM tbl WHERE name = @name
ELSE
    SELECT * FROM tbl

缺點:條件數 n 時需 2ⁿ 分支,維護困難、程式碼膨脹、計畫快取碎片化。

寫法二:動態 SQL 拼接 + EXEC(謹慎使用)

DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM tbl WHERE 1=1'
IF @addDate IS NOT NULL SET @sql += ' AND addDate = @addDate'
IF @name <> '' SET @sql += ' AND name = @name'
EXEC sp_executesql @sql, N'@addDate DATE, @name NVARCHAR(50)', @addDate, @name

優點:靈活、計畫可重用(參數化)。
缺點:需防 SQL 注入、除錯困難、權限要求高、易寫錯語法。

寫法三:邏輯合併單一查詢(推薦)

SELECT * FROM tbl
WHERE (@addDate IS NULL OR addDate = @addDate)
  AND (@name = '' OR name = @name)

優點:單一陳述式、計畫穩定、可讀性高、無注入風險、優化器易產生最佳計畫。
適用性:SQL Server、MySQL、PostgreSQL、Oracle 皆支援。

進階:搭配索引優化

  • 建立覆蓋索引:CREATE INDEX IX_tbl_addDate_name ON tbl(addDate, name) INCLUDE(其他常查欄位)
  • 避免隱含轉換:參數型別與欄位一致
  • 高選擇性欄位優先放索引前段

效能實測提示

邏輯合併寫法在參數為 NULL 時,優化器可能掃描全表。若資料量極大且頻繁全表掃描,可考慮:

  • 加入 OPTION (RECOMPILE) 強制依參數值重新編譯
  • 或回歸動態 SQL 產生精確計畫

原則:優先用邏輯合併,效能不足再優化,別過早複雜化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved