使用者介面提供 10+ 查詢條件 (單號、日期範圍、類別、狀態、關鍵字...),任意組合。傳統做法:
IF @param IS NOT NULL 分支 → 參數嗅探導致計畫不穩。在 WHERE 子句中為每組條件設計控制旗標,利用 SQL 布林邏輯短路特性,旗標為 0 時直接滿足條件,跳過後續昂貴運算。
WHERE
-- 條件組 1:單據狀態
(@Ctrl1 = 0 OR (@Ctrl1 = 1 AND DocStatus NOT IN (110,120,130)))
-- 條件組 2:日期範圍 (多種日期欄位)
AND (@Ctrl2 = 0 OR
(@Ctrl2 = 1 AND DocDate BETWEEN @DateB AND @DateE) OR
(@Ctrl2 = 2 AND DocNo IN (SELECT DocNo FROM SubTable1 WHERE SubDate BETWEEN @DateB AND @DateE)) OR
(@Ctrl2 = 3 AND DocNo IN (SELECT DocNo FROM SubTable2 WHERE RecDate BETWEEN @DateB AND @DateE)))
-- 條件組 3:單據類型
AND (@Ctrl3 = 0 OR (@Ctrl3 = 1 AND DocType = @DocType))
-- 條件組 4:業務種類 (多欄位 OR)
AND (@Ctrl4 = 0 OR (@Ctrl4 = 1 AND (SvcType1 = @SvcType OR SvcType2 = @SvcType OR SvcType3 = @SvcType)))
-- 條件組 5:狀態多選 (IN 清單)
AND (0 IN (@Ctrl5) OR
(1 IN (@Ctrl5) AND DocStatus IN (20)) OR
(2 IN (@Ctrl5) AND DocStatus IN (40,60)) OR
(3 IN (@Ctrl5) AND DocStatus IN (80)) ...)
-- 條條件組 6~N...
@CtrlX = 0 OR ... 確保短路在最左側,旗標關閉時零成本。@Ctrl1, @Ctrl2...@CtrlArray TABLE (Id INT) → (1 IN (SELECT Id FROM @CtrlArray) AND ...)@CtrlStr = 'YNNYY' → SUBSTRING(@CtrlStr, 1, 1) = 'Y' / CHARINDEX('A', @CtrlStr) > 0IN (SELECT...) 子查詢確保子查詢可 SARGable (有索引、無函數)。當 @Ctrl1=0 時,優化器識別 0=0 恆真,完全移除 後續條件的查詢運算子 (Constant Scan / Filter),不產生任何 I/O。
-- DW 查詢條件
WHERE (1 IN (:ctrl_array) AND Status = :status)
-- 陣列值:ctrl_array = {1,0,0,0,5,9} 表示第 1、5、6 組條件啟用
PB 原生支援陣列綁定,比字串解析更高效、型別安全。
「控制參數 + 短路邏輯」是多條件組合查詢的最佳平衡點:單一查詢結構、計畫穩定、零成本條件關閉、參數化安全、易於單元測試。適用於報表查詢、清單篩選、API 參數化查詢等高頻場景。