我想通过消除前面的零来规范化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。
谢谢你的帮助
3条答案
按热度按时间vof42yt11#
使用
CASE
表达式执行不同的替换,具体取决于值是否为全0。DEMO
也不需要单独调用
REGEXP_REPLACE()
来删除'h
和前导零。bjg7j2ky2#
你可以使用一个正则表达式,它匹配一个前导
'h
和0
,最多在行尾之前的一个字符(这将防止删除'h0000
中的所有0
),并用一个空字符串替换匹配:示例数据的输出:
| regexp_replace|
| --|
| 123ABC|
| 123ABC|
| 123ABC|
| 0 |
db-fiddle上的演示
zujrkrfu3#
您可以使用捕获组捕获最后一个字符并在替换中使用它。
Regex demo
输出