前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle里二进制与十进制的相互转换

Oracle里二进制与十进制的相互转换

作者头像
用户1148526
发布2019-05-25 19:27:21
1.3K0
发布2019-05-25 19:27:21
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库

Oracle里有内建函数bin_to_num可以将二进制数转换为十进制数,但这个函数的入参是个数不定的0或1:

[sql] view plain copy

  1. SELECT BIN_TO_NUM (1, 1, 1, 1, 0, 1, 1) FROM DUAL;

有时候入参使用一个二进制字符串会更加方便,另外Oracle本身没有提供num_to_bin这样将十进制转换成二进制的函数,于是写了两个自定义函数,算法很简单,不过这次追求的是用最少的代码实现。

[sql] view plain copy

  1. CREATE OR REPLACE FUNCTION bin_to_num1 (p_binstr VARCHAR2) RETURN NUMBER
  2. IS
  3. l_len NUMBER := LENGTH (p_binstr);
  4. r_num NUMBER := 0;
  5. BEGIN
  6. FOR i IN 1 .. l_len LOOP
  7. IF SUBSTR (p_binstr, i, 1) = '1' THEN
  8. r_num := r_num + POWER (2, l_len - i);
  9. END IF;
  10. END LOOP;
  11. RETURN r_num;
  12. END bin_to_num1;
  13. /

[sql] view plain copy

  1. SELECT bin_to_num1 ('1111011') FROM DUAL;

[sql] view plain copy

  1. CREATE OR REPLACE FUNCTION num_to_bin (p_num NUMBER) RETURN VARCHAR2
  2. IS
  3. r_binstr VARCHAR2 (32767);
  4. l_num NUMBER := p_num;
  5. BEGIN
  6. WHILE l_num != 0 LOOP
  7. r_binstr := TO_CHAR (MOD (l_num, 2)) || r_binstr;
  8. l_num := TRUNC (l_num / 2);
  9. END LOOP;
  10. RETURN r_binstr;
  11. END num_to_bin;
  12. /

[sql] view plain copy

  1. SELECT num_to_bin (123) FROM DUAL;
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年12月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档