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

问题描述

如何在 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

解决方法

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

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,'0'))
from (
  select trim(split_part(p_input,trim(split_part(p_input,2)) as p2 
) t;
$$
language sql
immutable;

然后像这样使用它:

select format_my_string(numbers)
from my_table

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...