首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SQL實現任意進制互轉:二/八/十/十六進制通用模板

     編輯:Oracle 資料庫基礎

純SQL實現進制轉換:從位運算到CONNECT BY分解重組

Oracle無內建進制轉換函數,但利用CONNECT BY LEVEL逐位拆解、POWER加權求和,可構建通用轉換邏輯。本文提供二→十、八→十、十六→十三大場景即用代碼,並說明擴展至任意進制的模板化思路。

核心算法原理

位權展開公式:
值 = Σ(第i位數字 × 基數^(總位數-i))
利用CONNECT BY LEVEL <= LENGTH(str)生成逐位序號,SUBSTR取單字符,POWER計算權重,SUM聚合。

即用代碼庫

1. 二進制 → 十進制

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

2. 八進制 → 十進制

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

3. 十六進制 → 十進制(含A-F字母處理)

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)構建字串。
  • 大數值溢位:Oracle NUMBER精度38位,超長輸入需用VARCHAR2分段運算或Java Stored Procedure。
  • 性能優化:高頻調用建議改用PL/SQL集合批量運算或編譯型Java類。

掌握CONNECT BY LEVEL分解字串與POWER加權思想,即可在純SQL層面實現任意進制互轉,無需外部程式依賴。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved