PostgreSQL子字符串和regexp_replace用零填充

wj8zmpe1  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(296)

我在build列中有以下条目:

4.4_sometext
4.9_sometext
4.11_sometext

我试过这两种方法:

SELECT regexp_replace(build, '_.*$', '') AS build
  FROM tableX 
 ORDER BY build

SELECT SUBSTRING(build FOR POSITION('_' IN build) -1) AS build 
  FROM tableX 
 ORDER BY build

两种方法都返回以下内容:

4.40
4.90
4.11

所以它正确地提取了数字,但是当只有1个十进制数时,在右边用零填充它,这改变了我的初始字符串。
有没有可能使它保持原来的小数位数?
更新:我在Grafana v9.4.7中使用了这个查询,并使用了一个条形图。

pvcm50d1

pvcm50d11#

是的,可以修改查询,通过使用LPAD()函数在提取的数字的右侧填充零来保留原始的小数位数。
下面是如何使用regexp_replace()修改第一个查询:

SELECT regexp_replace(build, '.*$', '') || '' || LPAD(SUBSTRING(build FROM '[0-9]+.[0-9]+$'), 2, '0') AS build
FROM tableX
ORDER BY build

下面是如何使用SUBSTRING()修改第二个查询:

SELECT SUBSTRING(build FOR POSITION('' IN build) -1) || '' || LPAD(SUBSTRING(build FROM '[0-9]+.[0-9]+$'), 2, '0') AS build
FROM tableX
ORDER BY build

在这两种情况下,我们都使用||操作符将提取的数字的原始版本(没有尾随零)与使用LPAD()函数填充零的相同数字连接起来。LPAD()的第二个参数是结果字符串的长度,我们将其设置为2以确保数字始终具有两位小数。LPAD()的第三个参数是填充字符,我们将其设置为'0'。

相关问题