Oracle無內建進制轉換函數,但利用CONNECT BY LEVEL逐位拆解、POWER加權求和,可構建通用轉換邏輯。本文提供二→十、八→十、十六→十三大場景即用代碼,並說明擴展至任意進制的模板化思路。
位權展開公式:
值 = Σ(第i位數字 × 基數^(總位數-i))
利用CONNECT BY LEVEL <= LENGTH(str)生成逐位序號,SUBSTR取單字符,POWER計算權重,SUM聚合。
SELECT SUM(bit_val) AS dec_val
FROM (
SELECT SUBSTR('1101', LEVEL, 1) * POWER(2, LENGTH('1101')-LEVEL) AS bit_val
FROM dual
CONNECT BY LEVEL <= LENGTH('1101')
);
結果:13
SELECT SUM(bit_val) AS dec_val
FROM (
SELECT SUBSTR('1101', LEVEL, 1) * POWER(8, LENGTH('1101')-LEVEL) AS bit_val
FROM dual
CONNECT BY LEVEL <= LENGTH('1101')
);
結果:577
SELECT SUM(bit_val) AS dec_val
FROM (
SELECT
CASE UPPER(SUBSTR('2D', LEVEL, 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 TO_NUMBER(SUBSTR('2D', LEVEL, 1))
END * POWER(16, LENGTH('2D')-LEVEL) AS bit_val
FROM dual
CONNECT BY LEVEL <= LENGTH('2D')
);
結果:45
CREATE OR REPLACE FUNCTION convert_base(
p_value VARCHAR2,
p_from_base NUMBER,
p_to_base NUMBER DEFAULT 10
) RETURN VARCHAR2 IS
-- 先轉十進制,再轉目標進制(略)
v_dec NUMBER;
BEGIN
-- 實現邏輯:驗證基數範圍2-36,處理負號、小數點、大小寫
RETURN TO_CHAR(v_dec); -- 簡示
END;
MOD + TRUNC)構建字串。VARCHAR2分段運算或Java Stored Procedure。掌握CONNECT BY LEVEL分解字串與POWER加權思想,即可在純SQL層面實現任意進制互轉,無需外部程式依賴。