資料倉庫報表常面臨「使用者可能輸入也可能不輸入」的查詢條件。若直接在 SQL 中動態拼接 WHERE 子句,不僅難以維護,還有 SQL 注入風險。本文介紹一種利用預設值與邏輯判斷的技巧,讓單一 SQL 陳述式優雅處理所有選填條件。
報表前端對未輸入欄位給予特定預設值:數字型給 -1、字串型給 '' (空字串)、日期型給 SYSDATE。SQL 中針對預設值與實際輸入值進行邏輯判斷,使條件在「未輸入」時恆為真、在「已輸入」時依值過濾。
SELECT *
FROM TestReportParameter
WHERE (' ' = &VarcharField OR VarcharField = &VarcharField)
AND (-1 = &NumberField OR NumberField = &NumberField)
AND (SYSDATE = &DateField OR DateField = &DateField);
若參數為預設值,前半部條件為真,整體 OR 為真,該欄位不參與過濾;若參數為實際值,前半部為假,依後半部比對過濾。
SELECT *
FROM TestReportParameter
WHERE (
' ' = DECODE(&VarcharField, ' ', ' ', &VarcharField)
OR VarcharField IN (&VarcharField)
)
AND (
-1 = DECODE(&NumberField, -1, -1, &NumberField)
OR NumberField IN (&NumberField)
);
DECODE (或 CASE) 確保當參數為預設值時,IN 子句不會變成 IN (' ') 導致邏輯錯誤。此模式可擴展至任意多欄位、多選值報表查詢,保持單一 SQL、無動態拼接、效能穩定。