如何在字符串之间格式化和插入字符 - Postgresql



我有这张表。

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

我将phone_number列格式化为此格式 (63(xxxxx。使用此代码
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但失败了。我做错了什么。我确实发现了与此相关的问题,但它们都是关于字符串替换的。

你可以

用几种方式做到这一点,我喜欢这个right()left()

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

要从格式 (63(xxxx 转换为 (63(xxx-xxxxxxx,您可以尝试

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, '(0d)(d{3})(d{6})', '(63)2-3');

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

您还可以使用回溯。

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

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

最新更新