sql - 如何在 Postgresql 中将尾随或前导零添加到“0.1201”或“01.00”总共 7 个数字
问题描述
如何在 Postgresql中添加尾随或前导零0.1201
或总共 7 个数字?1.00
假设我有下面的数据,我们必须将数字存储在 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, 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
推荐阅读
- docker - 如何使用 Traefik 将主机名(子域)映射到 Docker 容器?
- vb.net - 我可以重复使用表单来声明多个变量吗?
- wordpress - 去除除管理员以外的所有用户角色的简码
- asp.net-core - 强制刷新 IMemoryCache
- azure - 如何禁用 Azure 门户环境
- angular - 从对象数组中显示“实时”数量总和的最佳方式
- python - 两个有许多关系的 Django 树模型
- java - 如何以 JSON 格式下载 WordPress 数据?
- python - 如何确保 con1D 的 output_shape 与 keras 自动编码器中具有时间序列的 input_shape 相同?
- apache-kafka - 如何忽略从同一主题读取和写入不同事件类型的 Kafka Streams 应用程序中的某些类型的消息