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

Oracle WHERE 條件中 AND/OR 邏輯優先級與最佳寫法實戰

     編輯:Oracle 資料庫基礎

核心原則:括號明確分組

Oracle 解析條件時,AND 優先級高於 OR。缺乏括號會導致邏輯錯誤,務必用括號明確分組。

錯誤與正確範例對比

❌ 錯誤寫法

WHERE dept = 'SALES' OR dept = 'HR' AND salary > 50000
-- 實際執行邏輯:dept='SALES' OR (dept='HR' AND salary>50000)
-- SALES 部門所有員工都會被選中,不受薪資限制

✅ 正確寫法

WHERE (dept = 'SALES' OR dept = 'HR') AND salary > 50000
-- 明確分組:(SALES或HR) 且 薪資>50000

實戰範例解析

SELECT t.creator 建單人,
       t.titles 工單主題,
       t.statusdisplay 工單狀態,
       t.serialnumber 流水號
FROM up_itsm_iss t
JOIN v_depart_info rt ON t.creatorid = rt.USERID
WHERE (
        ('小計' = '{3}' AND t.iss_class LIKE '%{4}%')
     OR (rt.CNAME LIKE '{3}' AND t.iss_class LIKE '%{4}%')
      )
  AND t.creator <> 'root'
  AND (t.statusdisplay <> '已作廢' OR t.statusdisplay IS NULL);

邏輯拆解

  1. 第一組條件:參數 {3} 為「小計」時忽略部門篩選,否則依部門名稱 rt.CNAME 篩選;兩種情況皆需符合 iss_class LIKE '%{4}%'
  2. 排除系統帳號:t.creator <> 'root'
  3. 狀態過濾:非「已作廢」或狀態為 NULL

最佳實踐建議

  • 永遠使用括號:即使單層條件也建議加括號,提升可讀性
  • 格式化對齊:多行條件對齊 AND/OR,縮進子條件
  • 參數化查詢:避免字串拼接,使用 Bind Variable 防 SQL 注入
  • 索引友善:將高選擇性條件前置,避免 OR 導致全表掃描
  • NULL 處理:col = value OR col IS NULL 寫成 NVL(col, 'DEFAULT') = value 或 COALESCE 利用索引

進階技巧:CASE 表達式簡化複雜邏輯

WHERE CASE 
        WHEN '{3}' = '小計' THEN 1
        WHEN rt.CNAME LIKE '{3}' THEN 1
        ELSE 0
      END = 1
  AND t.iss_class LIKE '%{4}%'
  AND t.creator <> 'root'
  AND NVL(t.statusdisplay, '有效') <> '已作廢';

適用於多重互斥條件組合,執行計畫穩定性較佳。

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