我正在尝试替换字符串的第一个字符。我可以用 replace() 功能。但不知道如何替换列中所有字符串的第一个字符。样本数据:
replace()
Column1 43449927 13448927 53443457
将第一个字符替换为“7”后的预期结果:
Column1 73449927 73448927 73443457
dffbzjpn1#
下面的语法帮助了我,
'7' || substr(column1, 2, length(column1))
6rqinv9w2#
对于字符数据:
update mytable set data= '7' || substr(mycolumn, 2);
1bqhqjot3#
right() 负偏移是最短和最快的:
right()
'7' || right(column1, -1) ``` `replace()` 他不够聪明,不能把一个位置当作模式。一定会的 `regexp_replace()` :
regexp_replace(column1, '^.', '7')
但是正则表达式更昂贵。 细微差别:后者返回一个空字符串( `''` )对于空字符串输入,因为没有可替换的内容。如果这是您需要的行为,并且您仍然想要最佳性能,请将第一个 Package 在(便宜!) `CASE` 表达式:
CASE WHEN column1 <> ''THEN '7' || right(column1, -1)ELSE column1 END
作为参考:在linux上对postgres 12的快速测试中,表达式 `right()` 是。。。 比添加 `CASE` . 比以前快25% `substr()` 只有“from”参数。 约2倍的速度 `substr()` 带有冗余的“计数”参数(长度)。 ~3倍于 `overlay(column1 PLACING '7' FROM 1)` . 约10倍于 `regexp_repace()` . 在db中使用扩展测试用例测试矩阵
3条答案
按热度按时间dffbzjpn1#
下面的语法帮助了我,
6rqinv9w2#
对于字符数据:
1bqhqjot3#
right()
负偏移是最短和最快的:regexp_replace(column1, '^.', '7')
CASE WHEN column1 <> ''
THEN '7' || right(column1, -1)
ELSE column1 END