如何在字符串之间格式化和插入字符-Postgresql
Posted
技术标签:
【中文标题】如何在字符串之间格式化和插入字符-Postgresql【英文标题】:How to format and insert a character in between a string- 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)
?
我没有像那样使用子字符串。你是对的。
【参考方案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, '(\(\d2\)\d3)(\d6)', '\1-\2');
你也可以直接从原始格式转换成(63)xxx-xxxxxx,使用下面的
UPDATE member SET phone_number = regexp_replace(phone_number, '(0\d)(\d3)(\d6)', '(63)\2-\3');
我在这个链接http://rextester.com/VCX4636创建了一个示例
【讨论】:
【参考方案3】:您还可以使用lookbehinds。
select regexp_replace('(63)xxxxxxxxx','(?<=.7)','-')
当存在复杂的表达式而不是 phone_number
时,这特别有用,因此在多次调用 left()
、right()
或 substring()
函数时重复使用它是不希望的。
【讨论】:
以上是关于如何在字符串之间格式化和插入字符-Postgresql的主要内容,如果未能解决你的问题,请参考以下文章
使用 Rails 5 在 Postgres 中存储字符串化 JSON
postgres 将字符串插入数字列 - 不会发生自动类型转换