加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL的二进制转十进制实现

发布时间:2020-12-13 17:27:18 所属栏目:百科 来源:网络整理
导读:有一批老的数据需要导入到新的系统,需求上有所变更,要对原来存储的二进制数据转为十进制数据,网上搜了下没有现成的,就按原理写了一下,代码实现如下: 一、代码主体 CREATE OR REPLACE FUNCTION bin_to_dec(i_bin text) RETURNS numeric AS$BODY$declarev
有一批老的数据需要导入到新的系统,需求上有所变更,要对原来存储的二进制数据转为十进制数据,网上搜了下没有现成的,就按原理写了一下,代码实现如下:

一、代码主体
CREATE OR REPLACE FUNCTION bin_to_dec(i_bin text)
  RETURNS numeric AS
$BODY$
declare

v_len int;
v_length int;
v_pos int;
v_rec text;
v_value numeric;
v_record int;

begin

v_value = 0;

--判断是否二进制数据,否则直接退出
select length(trim(translate(i_bin,'[.01]',''))) into v_len;
if v_len >0 then
  return 99999999;
  exit;
end if;

--判断小数点是否只有一个,多于1个则退出
select length(translate(i_bin,'.'||i_bin,'.')) into v_len;
if v_len > 1 then
  return 88888888;
exit;

--整数部分,以下不含小数点
elsif v_len < 1 then
select length(i_bin) into v_length;
for v_rec in select regexp_split_to_table(i_bin,'') loop
  v_record := v_rec::int;
  v_value := v_value + v_record * power(2,v_length-1);
  v_length := v_length-1;
end loop;
return v_value;
exit;

--以下是含小数点的算法
else
select position('.' in i_bin),length(i_bin) into v_pos,v_len;
select length(substr(i_bin,1,v_pos-1)) into v_length;
for v_rec in select regexp_split_to_table(substr(i_bin,v_pos-1),v_length-1);
  v_length := v_length-1;
end loop;

v_length := -1;
for v_rec in select regexp_split_to_table(substr(i_bin,v_pos+1,v_len),'') loop
v_record := v_rec::int;
v_value := v_value + v_record * power(2,v_length);
v_length := v_length-1;
end loop;
return v_value;
exit;
end if;

return v_value;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
二、实现
postgres=#  select bin_to_dec('11.01');
 bin_to_dec 
------------
       3.25
(1 row)

postgres=#  select bin_to_dec('110');
 bin_to_dec 
------------
          6
(1 row)

postgres=#  select bin_to_dec('0.11');
 bin_to_dec 
------------
       0.75
(1 row)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读