作为一名SQL初学者,我正在尝试用以下格式记录电话字段:'"+国家标识符+电话号码'。
UPDATE public.contact
SET phone_number = CASE WHEN (country_code ='FR')
AND phone_number NOT LIKE '+33%'
AND phone_number <> NULL
THEN CONCAT('+33', phone_number)
WHEN (country_code ='GB')and phone_number NOT LIKE '+44%'
AND phone_number <> NULL
THEN CONCAT('+44', phone_number)
我想更新电话号码格式以包括国家标识符,如:0606080905->33606080905,如果country_code='FR'。我正在寻找一种比我所做的更快、更不复杂的方式。
您可以使用regexp_replace
对正则表达式执行此操作。
想象一下你的数据是:
+----------+--------------+
Table 'numbers': | country | phone |
+----------+--------------+
| FR | 0606080905 |
| FR | +33606080906 |
| GB | 0123456789 |
| GB | +44987654321 |
| GB | NULL |
+----------+--------------+
然后,对于所有不以+xx
开头且以FR
为国家/地区的号码,以下更新将用国家/地区代码+33
替换前导0
。
UPDATE numbers
SET phone = REGEXP_REPLACE(trim(phone), '^(0)', '+33')
WHERE country = 'FR'
解释:
^
表示字符串的开始(0)
是被替换的匹配项(前导零(+33
是用于替换它的字符串- 添加
trim()
只是为了安全,以防出现前导空格 NULL
电话号码不会受到影响,因为它们不匹配
对于每种不同的可能性,您现在可以像以前一样使用CASE WHEN
或类似的东西来完成此操作。但由于表达式总是相同的,一种更简单的方法是将您的国家代码及其数字映射放在一个单独的表中:
+----------+--------+
Table 'mapping': | country | prefix |
+----------+--------+
| FR | +33 |
| GB | +44 |
+----------+--------+
然后你可以做
UPDATE numbers n
SET phone = REGEXP_REPLACE(trim(phone), '^(0)', prefix)
FROM mapping m
WHERE m.country = n.country
并一次性更新您的所有号码:
+----------+--------------+
| country | phone |
+----------+--------------+
| FR | +33606080905 |
| FR | +33606080906 |
| GB | +44123456789 |
| GB | +44987654321 |
| GB | NULL |
+----------+--------------+
编辑:以前,我有一个不必要的复杂答案。如果你的电话号码模式更加多样化,你可能需要这样的东西。。。
以下更新将用国家/地区代码+33
替换所有不以+xx
开头且以FR
为国家/地区的前导0
。
UPDATE numbers
SET phone = REGEXP_REPLACE(trim(phone), '^(?<![+d{2}])(0)', '+33')
WHERE country = 'FR'
解释:
(?<![+])
是一个否定的后备断言,它确保正则表达式仅在前两位没有+
的情况下匹配(0)
是被替换的匹配项+33
是用于替换它的字符串- 添加
trim()
只是为了安全,以防出现前导空格 NULL
电话号码不会受到影响,因为它们不匹配
这是最简单的。
我能想到的加快处理速度的唯一方法是添加WHERE
条件,以避免更新不必修改的行。
您还可以并行运行几个这样的语句,每个语句都修改表的不同部分。
如评论中所述,<> NULL
是从不true。