我需要检查字符串的前2个字符是否与“ 00”,“ 01”或“ 02”匹配,并分别替换为“ 24”,“ 25”或“ 26”。
例如替换
'02:00:00' with '26:00:00'
我尝试:
SELECT replace(replace(replace('01:01:00'::varchar, '00:', '24:'),'01:', '25:'), '02:', '26:')
不起作用,因为它返回:
"25:25:00"
我只希望前2个字符符合条件:
"25:01:00"
也许regexp_replace是正确的方法,但我找不到解决方法。
答案 0 :(得分:2)
这是我先前的Oracle示例的PostgreSQL版本,在逻辑上做同样的事情。有时您需要进行RTFM! :-) 它使用substring()函数返回第一个组中的第一个元素,该函数经过测试,与您要替换的值交换,并与第二个substring()调用中返回的字符串的其余部分串联
select
case substring(str from '^(\d{2}:)')
when '00:' then '24:'
when '01:' then '25:'
when '02:' then '26:'
else substring(str from '^(\d{2}:)')
end || substring(str from '^\d{2}:(\d{2}:\d{2})$') as fixed
from tbl;
答案 1 :(得分:1)
select regexp_replace('01:01:03', '([0-9]{2})(:[0-9]{2}:[0-9]{2})', 'aa\2');
分为两组,第一组包含2个数字,第二组包含其他所有内容。替换表示打印新字符串,其他所有内容/第二组。
更新
感谢@franco_b。这是更新一些条目的版本:
select(regexp_replace('01:01:03','([[0-9] {2})(:[0-9] {2}:[0-9] {2})','\ 1'):: int + 24):: text || regexp_replace('01:01:03','([[0-9] {2})(:[0-9] {2}:[0-9 ] {2})','\ 2');