Postgres中能否像Oracle一样在REGEXP_REPLACE里使用length函数?
在PostgreSQL中用REGEXP_REPLACE结合length函数移除最后N个字符
当然可以!不过PostgreSQL的REGEXP_REPLACE参数顺序和Oracle不太一样,得调整写法才能实现和你Oracle语句相同的效果。
先回顾下你的Oracle语句:
SELECT REGEXP_REPLACE('ABC123','123','', LENGTH('ABC123') - 3) FROM dual;
这里你利用了OracleREGEXP_REPLACE的第四个参数(起始位置),定位到目标位置后替换指定内容。而PostgreSQL的REGEXP_REPLACE起始位置是第五个参数,参数顺序是:regexp_replace(string, pattern, replacement [, flags [, start [, count]]])。
实现相同效果的PostgreSQL写法
如果你想模仿Oracle的思路,用length函数指定起始位置来移除最后3个字符,可以这么写:
SELECT regexp_replace('ABC123', '.{3}', '', '', length('ABC123') - 3 + 1, 1);
拆解一下这个语句:
.{3}:匹配任意3个字符(通用匹配,比硬写'123'更灵活,适合任意最后3个字符的场景)- 第五个参数
length('ABC123') -3 +1:计算出起始位置(6-3+1=4),从第4个字符开始匹配 - 第六个参数
1:只替换1次,刚好把最后3个字符替换为空
执行后结果就是ABC,和你的Oracle语句效果一致。
额外提示:更高效的替代方案
其实PostgreSQL里移除最后N个字符,用LEFT函数会比正则更简单高效:
SELECT LEFT('ABC123', length('ABC123') - 3);
这个语句直接取字符串前总长度-3个字符,结果同样是ABC,性能比正则更好哦。
另外要注意,你之前用的regexp_replace('ABC123','[123]', '','g')和translate('ABC123','123', '')其实是替换所有指定字符,不是移除最后3个字符——如果字符串是A1B2C3,这两个语句会把所有数字都去掉得到ABC,和你想要的“移除最后3个字符”逻辑不同,要区分开。
内容的提问来源于stack exchange,提问作者slider_rahul
相关产品推荐
相关产品推荐

