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

資料倉庫複雜報表 SQL 撰寫技巧:善用預設值處理選填查詢條件

     編輯:關於SqlServer

資料倉庫報表常面臨「使用者可能輸入也可能不輸入」的查詢條件。若直接在 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 為真,該欄位不參與過濾;若參數為實際值,前半部為假,依後半部比對過濾。

多選值條件處理 (必須用 DECODE/CASE)

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、無動態拼接、效能穩定。

注意事項

  • 過於複雜的邏輯建議改用預存程序封裝
  • 大型資料表上避免全表掃描,需配合適當索引
  • 參數化查詢防止 SQL 注入
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved