【发布时间】:2015-03-22 20:07:05
【问题描述】:
我有一个表Contact,其中包含所有带有电话号码的用户联系人,并且需要对电话号码进行一些转换。
我需要查看所有电话号码,并且:
-
删除电话号码中出现的以下字符序列
(0); -
前缀
+<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 |
+-----+--------------+--------+
【问题讨论】:
-
乍一看,我说看看 regexp_replace
-
对此没有简单的解决方案。例如,您可以在这里查看类似的问题 (php + regexp),stackoverflow.com/questions/12551473/…。 @Tomáš Fejfar 引用了通过正则表达式来满足的标准要求,en.wikipedia.org/wiki/E.164。
-
@Patrick,我不同意。这在支持 POSIX 正则表达式的 Oracle 中并不难做到。
-
@David Faber 是的,如果我们只是清理带有
(0)或缺少国家/地区直拨号码的电话号码,这是可行的(您的解决方案可以做到这一点)。如果我们想确保某个号码符合 E.164,这是具有挑战性的(此处未要求)。
标签: sql regex oracle oracle11g regexp-replace