【问题标题】: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[] 来实现

标签: sql postgresql replace regexp-replace


【解决方案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 中的strleft 给出12.,而使用负数位置的右侧给出34.56.78,替换然后删除点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2022-10-07
    • 2016-03-20
    • 2019-04-19
    相关资源
    最近更新 更多