regexp sub如何替换数字流的前面的零,同时保留全零流的最后一个零(postgres)

rt4zxlrg  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(108)

我想通过消除前面的零来规范化PG表的varchar col中存储的十六进制数(我需要比较可能表示不同的值)。很简单。但我也想保留最后一个零,如果数字流都是零的话。例如...

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)

正如你所看到的,实际的十六进制瓦尔有一个“h”前缀,我不得不去掉它。我想在瓦尔为0的情况下保留一个0。我希望最后一行是“0”。
我将把这个文件放在PG和regexp以及regexp-replace下,因为我希望直接的regexp soln可以Map到SQL func regexp_replace。
谢谢你的帮助

vof42yt1

vof42yt11#

使用CASE表达式执行不同的替换,具体取决于值是否为全0。

SELECT CASE
        WHEN REGEXP_LIKE(col1, '^''h0+$') THEN '0'
        ELSE REGEXP_REPLACE(col1, '^''h0*', '')
    END AS new_col1
FROM foo

DEMO
也不需要单独调用REGEXP_REPLACE()来删除'h和前导零。

bjg7j2ky

bjg7j2ky2#

你可以使用一个正则表达式,它匹配一个前导'h0,最多在行尾之前的一个字符(这将防止删除'h0000中的所有0),并用一个空字符串替换匹配:

SELECT REGEXP_REPLACE(col1, '^''h0*(?=.+$)', '')
FROM foo

示例数据的输出:
| regexp_replace|
| --|
| 123ABC|
| 123ABC|
| 123ABC|
| 0 |
db-fiddle上的演示

zujrkrfu

zujrkrfu3#

您可以使用捕获组捕获最后一个字符并在替换中使用它。

^''h0*(.)

Regex demo

SELECT REGEXP_REPLACE(col1, '^''h0*(.)', '\1')

输出

123abc
123abc
123abc
0

相关问题