TABLE:
VDEF1 VARCHAR2 -- 默認值 '~',可能包含數字字符串
VDEF2 NUMBER
需求:查詢 VDEF2 - VDEF1 = 0 的記錄
VDEF1 為 VARCHAR2,直接 VDEF2 - VDEF1 隱式轉換失敗(遇到 '~' 拋 ORA-01722: invalid number)。
SELECT * FROM table_name
WHERE VDEF2 - DECODE(VDEF1, '~', 0, VDEF1) = 0;
-- 邏輯:若 VDEF1='~' 則視為 0,否則隱式轉數字參與運算
SELECT * FROM table_name
WHERE VDEF2 - CASE
WHEN VDEF1 = '~' THEN 0
ELSE TO_NUMBER(VDEF1)
END = 0;
SELECT * FROM table_name
WHERE VDEF2 - CASE
WHEN REGEXP_LIKE(VDEF1, '^\d+$') THEN TO_NUMBER(VDEF1)
ELSE 0
END = 0;
CREATE INDEX idx_vdef1_clean ON table_name (
CASE WHEN VDEF1 = '~' THEN 0 ELSE TO_NUMBER(VDEF1) END
);
'~' 改為 NULL 或單獨標記列 IS_DEFAULT CHAR(1)。CASE
WHEN VDEF1 IN ('~', '#', '*', '') THEN 0
ELSE TO_NUMBER(VDEF1)
END
「脏數據進庫,查詢時洗」是常態 —— 用 CASE WHEN 封裝清洗邏輯,讓 SQL 既能跑通、又能利用索引,是工程化的成熟姿態。