如何在Postgresql中将尾随或前导零添加到`0.1201`或`01.00`总共7个数字

时间:2021-05-28 07:48:40

标签: sql postgresql

如何在 Postgresql 中为 0.12011.00 总共 7 个数字添加尾随或前导零?

假设我有下面的数据,我们必须将数字存储在 varchar 列中(这不是一个损坏的数据库设计,我们在此列中也有一些 02.34x924 的值,请告诉我如何保存它们转换为数字或双精度)

numbers
0.1201
 1.00 
26.25
02.34x924

我期望的输出是,小数点左边两个数字,小数点右边四个数字,包括小数点总共7个数字

numbers
00.1201
01.0000 
26.2500
02.34x924

我可以使用下面的 SQL 让 26.25 等于 26.2500,但我无法处理 0.1201 1.00

select 
case when length(numbers) < 7 then rpad(numbers, 7, '0') else numbers end numbersnew
from mytable

1 个答案:

答案 0 :(得分:1)

我会将值分成两部分,然后单独填充每个部分。

select concat(lpad(p1, 2, '0'), 
              '.', p2, 
              rpad('0', 4 - length(p2), '0'))
from (
  select trim(split_part(numbers, '.', 1)) as p1, 
         trim(split_part(numbers, '.', 2)) as p2 
  from my_table
) t  

派生表主要是为了避免重复表达式来获取每个部分。

我会将其放入一个函数中,以使您的查询更易于阅读:

create function format_my_string(p_input text)
  returns text
as
$$
select concat(lpad(p1, 2, '0'), 
              '.', p2, 
              rpad('0', 4 - length(p2), '0'))
from (
  select trim(split_part(p_input, '.', 1)) as p1, 
         trim(split_part(p_input, '.', 2)) as p2 
) t;
$$
language sql
immutable;

然后像这样使用它:

select format_my_string(numbers)
from my_table
相关问题