在 Oracle 資料庫開發中,經常需要根據多個條件動態組合查詢邏輯。傳統的 CASE WHEN 或動態 SQL 雖然可行,但利用 Oracle 內建的 INSTR() 與 DECODE() 函數往往能寫出更簡潔、效能更佳的靜態 SQL。本文將詳細解析這兩個函數的語法特性,並示範如何將它們結合應用於實際的多條件查詢場景。
INSTR() 用於在字串中尋找子字串的出現位置,是字串操作的基石函數之一。
INSTR(string1, string2 [, start_position [, nth_appearance]])
回傳子字串在目標字串中的位置(從 1 開始計數),若未找到則回傳 0。
DECODE() 是 Oracle 特有的條件判斷函數,功能相當於 IF-THEN-ELSE 邏輯,在 SQL 中極為實用。
DECODE(expression, search1, result1 [, search2, result2 ...] [, default])
以下範例展示如何結合 INSTR() 與 DECODE() 實現靈活的條件篩選。假設我們需要從流程相關表中查詢特定業務數據,並根據「處理動作」欄位進行動態標記:
SELECT
e.到達日期,
e.角色名,
d.單據標題,
d.單據編號,
e.節點編號,
e.處理動作,
e.處理日期,
b.流程實例編號,
-- 使用 INSTR 判斷動作包含特定關鍵字,配合 DECODE 輸出中文狀態
DECODE(INSTR(e.處理動作, '簽核'), 0, '一般處理', '簽核流程') AS 動作類型,
DECODE(INSTR(e.處理動作, '退回'), 0, '', ' [需關注]') AS 異常標記
FROM
gzl_流程類型 a,
gzl_流程實例 b,
gzl_流程定義 c,
dj_單據 d,
gzl_流程流轉狀態 e
WHERE
a.流程類型編號 = b.流程類型編號
AND b.流程實例編號 = c.流程實例編號
AND c.單據編號 = d.單據編號
AND b.流程實例編號 = e.流程實例編號
-- 利用 INSTR 進行模糊條件過濾
AND (INSTR(e.處理動作, '簽核') > 0 OR INSTR(e.處理動作, '核准') > 0);
掌握 INSTR() 與 DECODE() 的組合技巧,能讓你在處理複雜多條件查詢時游刃有餘。實際開發中,建議根據業務複雜度在 DECODE、CASE 及動態 SQL 之間權衡選擇,追求「SQL 解決業務邏輯,應用層專注流程控制」的最佳實踐。