如何替换第二次出现的点

how to replace dots from 2nd occurrence

我有软件版本专栏。我试图从列中的第 2 次出现中删除点,例如

select REGEXP_REPLACE('12.5.7.8', '.','');

预期输出是 12.578

样本数据为here

是否可以删除第二次出现的点

一个选择是将其分成两部分:

  • 获取第一个数字。
  • 将其余数字作为数组获取。

然后将数组转换为无分隔符的字符串,并与第一个合并:

select (split_part('12.5.7.8', '.', 1) || '.' || 
        array_to_string((REGEXP_SPLIT_TO_ARRAY('12.5.7.8', '[.]'))[2:], '')
       )

另一种选择是将第一个 '.' 替换为其他内容,然后删除 '.' 并将其他内容替换为 '|':

select translate(regexp_replace(version, '^([^.]+)[.](.*)$', '|'), '|.', '.')
from software_version;

Here 是一个 db<>fiddle 三个版本,包括评论中提到的 a_horse_with_no_name 版本。

我只走左边和右边:

concat(
  left(str, position('.' in str)), 
  replace(right(str, -position('.' in str)), '.', '')
)

对于 12.34.56.78strleft 给出 12. 并且使用负数位置的权利给出 34.56.78 然后替换删除点