如何替换第二次出现的点
Posted
技术标签:
【中文标题】如何替换第二次出现的点【英文标题】:how to replace dots from 2nd occurrence 【发布时间】:2021-09-24 08:01:28 【问题描述】:我有软件版本的专栏。我试图从列中的第二次出现中删除点,例如
select REGEXP_REPLACE('12.5.7.8', '.','');
预计为 12.578
样本数据为here
是否可以从第二次出现中删除点
【问题讨论】:
“第二次出现后删除点”对我来说意味着结果应该有 2 个点。您想要的结果是 1。哪个是正确的? 如果您的目标是创建“可排序”的东西,那么您也可以通过将其转换为数组string_to_array('12.5.7.8', '.')::int[]
来实现
【参考方案1】:
一种选择是将其分成两部分:
获取第一个数字。 以数组形式获取其余数字。然后将数组转换为不带分隔符的字符串,并与第一个合并:
select (split_part('12.5.7.8', '.', 1) || '.' ||
array_to_string((REGEXP_SPLIT_TO_ARRAY('12.5.7.8', '[.]'))[2:], '')
)
另一种选择是将第一个 '.'
替换为其他内容,然后删除 '.'
s 并将其他内容替换为 '|'
:
select translate(regexp_replace(version, '^([^.]+)[.](.*)$', '\1|\2'), '|.', '.')
from software_version;
Here 是三个版本的数据库fiddle,包括评论中提到的 a_horse_with_no_name 版本。
【讨论】:
不需要regexp_split_to_array()
(string_to_array('12.5.7.8', '.'))[2:]
也可以工作,并且可能更快,因为不涉及正则表达式
@GordonLinoff 我看到第二版和第三版查询比Here中的第一版查询快【参考方案2】:
我只取左右:
concat(
left(str, position('.' in str)),
replace(right(str, -position('.' in str)), '.', '')
)
对于12.34.56.78
中的str
,left
给出12.
,而使用负数位置的右侧给出34.56.78
,替换然后删除点
【讨论】:
以上是关于如何替换第二次出现的点的主要内容,如果未能解决你的问题,请参考以下文章
使用 Powershell 将第二次出现的“-”替换为“_”