在 Netezza 中将带分数转换为浮点数

Posted

技术标签:

【中文标题】在 Netezza 中将带分数转换为浮点数【英文标题】:Converting a mixed fraction to a float number in Netezza 【发布时间】:2015-08-17 04:20:21 【问题描述】:

我有一个数字以 3 种格式存储为文本的字段:

xx. (example: 31.)
xx.x (example: 31.2)
xx x/x (example: 31 2/7)

对于最终结果,我需要所有数字都是十进制格式(即 xx.x)。

将前两种格式转换为小数相当简单,但我还没有完全弄清楚如何转换最后一种情况,因为简单的 CAST 函数不起作用。我已经使用 INSTR 函数来隔离这些数字的所有小数情况,但我不知道从那里去哪里。我查看了其他示例,但某些引用的函数(如 SUBSTRING_INDEX)在 Netezza 中不存在。

【问题讨论】:

【参考方案1】:

我认为@Niederee 有蛮力的解决方案,但我会使用sql extensions toolkit。

create temporary table fractions (
  val nvarchar(64)
) distribute on random;

insert into fractions values ('2.');
insert into fractions values ('2.3');
insert into fractions values ('31 2/7');
insert into fractions values('2 0/8');
insert into fractions values('516 56/537');

select
  val
  ,case
    when regexp_like(val,'^[\d\.]+$') then val::numeric(20,10) --Cast it if we can.
    when regexp_like(val,'^[\d\.\s\/]+$')
      then regexp_extract(val,'\d+',1,1)::numeric(20,10) --Whole.
        + ( 
          regexp_extract(val,'\d+',1,2)::numeric(20,10) --Numerator.
          / regexp_extract(val,'\d+',1,3)::numeric(20,10) --Denominator.
        )
    else null
  end
from
  fractions;

【讨论】:

【参考方案2】:

尝试以下方法:

create temp table so_test (
txt_val varchar(100)
);

insert into so_test values ('31.');
insert into so_test values ('31.2');
insert into so_test values ('31 2/7');

select txt_val
, cast(decode(substr(txt_val,1,instr(txt_val,' ')),'',txt_val,substr(txt_val,1,instr(txt_val,' ')))  as numeric(18,2))  as root
,cast(substr(txt_val,instr(txt_val,' ')+1,length(txt_val)-instr(txt_val,'/')) as numeric(18,2))
/cast(substr(txt_val,instr(txt_val,'/')+1,length(txt_val)) as numeric(18,2)) as fraction
,cast(root + case when fraction = 1 then 0 else fraction end as numeric(3,1)) as num_val

from so_test

【讨论】:

【参考方案3】:

感谢大家的帮助。我忘了关闭它,我实际上想出了一个方法:

select
  case when instr(num,'/') > 0 then 
       cast(substr(num,1,2) as float) 
       + (cast(substr(num,4,1) as float)/cast(substr(num,6,1) as float))
  when instr(num,'.') > 0 then cast(substr(num,1,4) as float) 
  else cast(num as float)
end as float_num

【讨论】:

以上是关于在 Netezza 中将带分数转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中将23位浮点数从字符串转换为浮点数并返回?

在 C# 中将字符串转换为浮点数

如何将 Vulgar 分数转换为浮点数?

无法在python中将字符串转换为浮点数

在 C++ 中将字符串转换为浮点数

如何在java中将4字节数组转换为浮点数