在 Oracle 資料庫環境中,利用 CONNECT BY 階層式查詢搭配 SUBSTR 逐字元拆解,再配合 POWER 次方運算,即可將任意進位字串轉換為十進位數值。以下提供三種常見進制的轉換範例,邏輯清晰,易於擴充至其他進制。
SELECT SUM(data1)
FROM (
SELECT SUBSTR('1101', ROWNUM, 1) * POWER(2, LENGTH('1101') - ROWNUM) AS data1
FROM dual
CONNECT BY ROWNUM <= LENGTH('1101')
);
SELECT SUM(data1)
FROM (
SELECT SUBSTR('1101', ROWNUM, 1) * POWER(8, LENGTH('1101') - ROWNUM) AS data1
FROM dual
CONNECT BY ROWNUM <= LENGTH('1101')
);
十六進位需處理 A-F 字元,使用 CASE 將字元對應至 10-15:
SELECT SUM(data1)
FROM (
SELECT
(CASE UPPER(SUBSTR('2D', ROWNUM, 1))
WHEN 'A' THEN 10
WHEN 'B' THEN 11
WHEN 'C' THEN 12
WHEN 'D' THEN 13
WHEN 'E' THEN 14
WHEN 'F' THEN 15
ELSE SUBSTR('2D', ROWNUM, 1)
END) * POWER(16, LENGTH('2D') - ROWNUM) AS data1
FROM dual
CONNECT BY ROWNUM <= LENGTH('2D')
);
原理解析:
CONNECT BY ROWNUM <= LENGTH(str) 產生 1 到字串長度的數列,SUBSTR(str, ROWNUM, 1) 逐一取出字元,乘以 POWER(基數, 位置權重) 後加總,即得十進位結果。此技巧常用於 ETL 資料清洗或異質資料整合情境。