3

我有一个表格Contact,其中包含所有带有电话号码的用户联系人,并且需要对电话号码进行一些转换。

我需要查看所有电话号码,并且:

  1. (0)删除电话号码中出现的以下字符序列;

  2. +<country_code>在缺少前缀和插入电话号码时添加前缀;

例子:

电话号码:
+1 (0) 121 121 121
需要转换为:
+1 121 121 121

电话号码:
(0) 121 121 121
需要转换为:
+1 121 121 121

电话号码:
121 121 121
需要转换为:
+1 121 121 121

根据第1点:

我们可以通过查询选择所有电话号码:

select phone from contact where phone like '%(0)%';

但是如何(0)仅从数字中删除该序列?如何为此创建更新查询?

根据第2点:

如何识别电话号码是否不包含国家/地区直接号码(前缀+<country_code>)并在缺少时添加正确的号码?也许这个查询应该可以选择这些数字:

select phone from contact where phone not like '%+%';

我们可以假设。假设我们在联系人表中有一个国家列,对于国家代码列表,我们可以基于此创建临时映射表 -> http://countrycode.org/。我们可以简单地创建一个包含国家代码 <-> 国家前缀映射的临时表,如下所示。

我想应该可以调用一个更新查询,该查询在第一步将选择格式错误的所有电话号码,在第二步将使用新的正确值进行更新,对吗?我对 SQL 不是很了解,所以请帮我创建这样的 SQL 查询?

表联系方式:

+-----+-----------+----------+---------+------------------------+
| id  | firstname | lastname | country | phone                  |
+-----+-----------+----------+---------+------------------------+
| 100 | Frank     | Grob     |   PL    | +48 22 121 121 121     | <- OK
| 101 | Bob       | Bloby    |   PL    | (0)22 121 121 121      | <- Wrong
| 102 | Alice     | Wonder   |   US    | +1 (0) 121 121 121     | <- Wrong
| 103 | Chris     | Black    |   US    | +1 (0) 121 121 121     | <- Wrong
| 104 | Rocky     | Rocky    |   US    |  +1 (0) 121 121 121    | <- Wrong
+-----+-----------+----------+---------+------------------------+

表 COUNTRY_MAPPING:

+-----+--------------+--------+
| id  | country_code | prefix |
+-----+--------------+--------+
| 100 | PL           | 48     |
| 101 | US           | 1      |
+-----+--------------+--------+
4

1 回答 1

2

这应该不难。如果您的表中有一个国家代码列CONTACT和一个单独的表COUNTRY_MAPPING,那么这样的查询可能如下所示(仅供参考,波兰的前缀48与您在表中正确使用的一样CONTACT,而不是22在您的COUNTRY_MAPPING表中使用的):

SELECT c.id, c.firstname, c.lastname, c.country, c.phone
     , REGEXP_REPLACE(REGEXP_REPLACE(c.phone, '\(0\)\s*'), '^([^+])', '+' || cm.prefix || ' \1') AS new_phone
  FROM contact c, country_mapping cm
 WHERE REGEXP_LIKE(c.phone, '(^[^+]|\(0\))')
   AND c.country = cm.country_code

请在此处查看 SQL Fiddle 演示。

对于一个UPDATE我会推荐以下内容:

1、根据上面的查询创建一个临时表:

CREATE TABLE contact_newphone AS
SELECT c.id, c.firstname, c.lastname, c.country, c.phone
     , REGEXP_REPLACE(REGEXP_REPLACE(c.phone, '\(0\)\s*'), '^([^+])', '+' || cm.prefix || ' \1') AS new_phone
  FROM contact c, country_mapping cm
 WHERE REGEXP_LIKE(c.phone, '(^[^+]|\(0\))')
   AND c.country = cm.country_code

2. 从该临时表更新:

UPDATE contact c
   SET c.phone = ( SELECT cn.newphone FROM contact_newphone cn
                    WHERE cn.id = c.id )
 WHERE REGEXP_LIKE(c.phone, '(^[^+]|\(0\))') -- don't want to update anyone's phone# that might have been fixed!
   AND EXISTS ( SELECT 1 FROM contact_newphone cn
                 WHERE cn.id = c.id )

3. 删除“临时”表 - 或将其保留为旧的、坏的电话号码的备份。

更新:如果phone列中有前导空格,您可以在步骤 1 中执行以下操作

CREATE TABLE contact_newphone AS
SELECT c.id, c.firstname, c.lastname, c.country, c.phone
     , REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_REPLACE(c.phone, '^\s+'), '\(0\)\s*'), '^([^+])', '+' || cm.prefix || ' \1') AS new_phone
  FROM contact c, country_mapping cm
 WHERE REGEXP_LIKE(c.phone, '(^[^+]|\(0\))')
   AND c.country = cm.country_code

请在此处查看 SQL Fiddle 演示。这也将删除电话号码中原本很好的前导空格。

于 2015-01-23T23:54:40.410 回答