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

Converting a mixed fraction to a float number in Netezza

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

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

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

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

尝试以下操作:

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

我认为@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;

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

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