關聯查詢中,若連接鍵一方為 VARCHAR2 純數字字串(如 '00187'),另一方為 NUMBER(如 187),Oracle 會自動將字串轉換為數值進行比較,效果等同 TO_NUMBER()。本文驗證行為並說明最佳實踐。
SELECT CASE WHEN '0110' = 110 THEN 'TRUE' ELSE 'FALSE' END FROM DUAL; -- TRUE
SELECT CASE WHEN TO_NUMBER('0110') = TO_NUMBER(110) THEN 'TRUE' ELSE 'FALSE' END FROM DUAL; -- TRUE
兩條語句均回傳 TRUE,確認 Oracle 隱含執行了 TO_NUMBER('0110') → 110。
TO_NUMBER)TO_DATE,依 NLS_DATE_FORMAT)WHERE varchar_col = 123 觸發 TO_NUMBER(varchar_col),導致 varchar_col 索引無法使用ORA-01722: invalid number'123A')比較時會拋出異常,應用程式崩潰-- 明確轉換,語意清晰且索引可用(若對應欄位為 NUMBER) WHERE TO_NUMBER(varchar_col) = number_col -- 或統一為字串比較(若對應欄位為 VARCHAR2) WHERE varchar_col = TO_CHAR(number_col, 'FM00000') -- 保留前導零格式
雖然 Oracle 自動轉換帶來便利,但生產環境強烈建議顯式轉換,避免索引失效、執行計畫抖動與運行時異常。