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);
{3} 為「小計」時忽略部門篩選,否則依部門名稱 rt.CNAME 篩選;兩種情況皆需符合 iss_class LIKE '%{4}%'t.creator <> 'root'AND/OR,縮進子條件OR 導致全表掃描col = value OR col IS NULL 寫成 NVL(col, 'DEFAULT') = value 或 COALESCE 利用索引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, '有效') <> '已作廢';
適用於多重互斥條件組合,執行計畫穩定性較佳。