【问题标题】:How to format and insert a character in between a string- Postgresql如何在字符串之间格式化和插入字符-Postgresql
【发布时间】:2017-03-29 02:45:35
【问题描述】:

我有这张桌子。

member_id | phone_number -----------+-------------- 1 | 09151234567 2 | 09904897851 3 | 09196332111 4 | 09957935412 5 | 09251279633 6 | 09357489412 7 | 09155974684 (7 rows)

我将 phone_number 列格式化为这种格式 (63)xxxxxxxxx。使用此代码
update member set phone_number = regexp_replace(phone_number, '0(.)', '(63)');

member_id | phone_number
-----------+--------------- 1 | (63)151234567 2 | (63)904897851 3 | (63)196332111 4 | (63)957935412 5 | (63)251279633 6 | (63)357489412 7 | (63)155974684 (7 rows)

现在我需要再次将此列更新为这种格式 (63)xxx-xxxxxx。 我不想替换字符,我需要在字符串之间插入一个字符。 我尝试过使用子字符串 regexp_replace 但失败了。我做错了什么。我确实找到了与此相关的问题,但它们都是关于字符串替换的。

【问题讨论】:

  • 如果你有正确的格式,为什么不直接使用substring(phone_number from 1 for 7) || '-' || substring(phone_number from 8)
  • 我没有像那样使用子字符串。你是对的。

标签: sql postgresql postgresql-9.1 postgresql-9.2


【解决方案1】:

你可以通过几种方式做到这一点,我喜欢right()left()的这个:

update member 
set phone_number = format('%s-%s', left(phone_number, 7), right(phone_number, -7));

【讨论】:

    【解决方案2】:

    要将(63)xxxxxxxxx格式转换成(63)xxx-xxxxxx格式,可以试试

    UPDATE member SET phone_number = regexp_replace(phone_number, '(\(\d{2}\)\d{3})(\d{6})', '\1-\2');
    

    你也可以直接从原始格式转换成(63)xxx-xxxxxx,使用下面的

    UPDATE member SET phone_number = regexp_replace(phone_number, '(0\d)(\d{3})(\d{6})', '(63)\2-\3');
    

    我在这个链接http://rextester.com/VCX4636创建了一个示例

    【讨论】:

      【解决方案3】:

      您还可以使用lookbehinds。

      select regexp_replace('(63)xxxxxxxxx','(?<=.{7})','-')
      

      当存在复杂的表达式而不是 phone_number 时,这特别有用,因此在多次调用 left()right()substring() 函数时重复使用它是不希望的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-07
        相关资源
        最近更新 更多