提问人:daveg 提问时间:10/20/2023 最后编辑:Barmardaveg 更新时间:10/20/2023 访问量:50
正则表达式 sub 如何替换数字流的前零,同时保留所有零流的最后一个零 (postgres)
how can regexp sub replace preceding zeros of stream of digits while keeping the last zero of a stream of all zeros (postgres)
问:
我想通过消除前面的零来规范化存储在 PG 表的 varchar 列中的十六进制数(我需要比较可能以不同方式表示的 vals)。很简单。但是,如果数字流都是零,我也想保留最后一个零。例。。。
create table foo (col1 varchar);
insert into foo (col1) values ('''h000123abc'),('''h123abc'),('''h0123abc'),('''h000000000');
select regexp_replace(regexp_replace(col1,'''h',''),'^0+','') from foo;
regexp_replace
----------------
123abc
123abc
123abc
(4 rows)
正如你所看到的,实际的十六进制 val 有一个“'h”前缀,我必须去掉它。 我想在 val 为 0 的情况下保留单个 0。我希望最后一行是“0”。
我将在 PG 和 regexp 以及 regexp-replace 下提交这个,因为我希望直接的正则表达式 soln 会映射到 SQL func regexp_replace。
感谢您的帮助
答:
1赞
Barmar
10/20/2023
#1
使用表达式根据值是否全部为 0 执行不同的替换。CASE
SELECT CASE
WHEN REGEXP_LIKE(col1, '^''h0+$') THEN '0'
ELSE REGEXP_REPLACE(col1, '^''h0*', '')
END AS new_col1
FROM foo
也无需使用单独的调用来删除前导零。REGEXP_REPLACE()
'h
1赞
Nick
10/20/2023
#2
您可以使用正则表达式,在行尾之前将前导与 匹配至少一个字符(这将防止删除 中的所有 s) 并将匹配项替换为空字符串:'h
0
0
'h0000
SELECT REGEXP_REPLACE(col1, '^''h0*(?=.+$)', '')
FROM foo
示例数据的输出:
regexp_replace |
---|
123ABC公司 |
123ABC公司 |
123ABC公司 |
0 |
db-fiddle 演示
1赞
The fourth bird
10/20/2023
#3
您可以使用捕获最后一个字符的捕获组,并在替换中使用该捕获组。
^''h0*(.)
SELECT REGEXP_REPLACE(col1, '^''h0*(.)', '\1')
输出
123abc
123abc
123abc
0
评论