在数据库中搜索多种电话号码格式

时间:2018-08-23 15:05:55

标签: sql sql-server oracle

我有一个带有用户表的数据库。该表包含一列16138649264659050412 。问题在于它的字段使用多个数字模式。

我发现的当前模式:

  • 06403 / 975-0
  • +496403975 0
  • 06403 975-0
  • 06403 975 0
  • +49 6403 975 0

在数据库中搜索用户时,是否可以搜索所有数字模式?

phonenumber

我使用Oracle和MS SQL

3 个答案:

答案 0 :(得分:4)

假设您的问题是这样的:

“在WHERE子句中进行比较之前,是否可以从存储的电话号码中删除所有非数字字符?”

可能的解决方案如下:

... 
where translate(phone, '0123456789' || phone, '0123456789') = <input value here>

TRANSLATE会将每个数字转换为自身,而phone中的所有其他字符则转换为零(它们将从字符串中删除)。这正是您想要的。

如果发现查询速度很慢,则可能要在translate(phone, '0123456789' || phone, '0123456789')上创建(基于函数的)索引。

编辑:我错过了您所说的同时使用Oracle和SQL Server的部分。我进行了快速搜索,发现SQL Server没有类似于Oracle TRANSLATE的功能。我将它留给SQL Server专家来帮助您完成这一部分。我不知道SQL Server。

答案 1 :(得分:3)

在Oracle中,您可以这样做。用translate()去除非数字字符以获取电话号码。您需要处理前导零或国际拨号代码:

select username from your_table
where translate(phone, '1234567890+/ -', '1234567890') in ('064039750', '4964039750')

如果您不知道国际拨号代码是什么,则可能需要进行调整。

显然,实际问题是数据质量之一:应用程序应对电话号码强制采用严格的格式。写入时进行一连串的数据清理可以节省读取时的麻烦。

答案 2 :(得分:2)

您有一个包含电话号码的数据库。这些有时是国际格式,但经常是某些国家格式,可能是德语,其中两个前导零会引入一个国家代码,而一个前导零会引入一个区号(假设本国德国)。而且,电话号码可以包含可读性的符号,即'-''/'' '

所以

  • +49 12 / 3456-7当然是+491234567
  • 00441234567表示+441234567
  • 04412345表示+494412345

我建议您按照以下步骤将所有数字转换为国际格式:

  1. 将前导+替换为前导00,从而仅使数字变得重要
  2. 删除所有不是数字的字符
  3. 将领先的00替换为领先的+
  4. 将领先的0替换为领先的+49

为此使用Oracle的REGEXP_REPLACE

select 
  regexp_replace( 
    regexp_replace(
      regexp_replace(
        regexp_replace(trim(phone),
          '^\+', '00'), -- leading '+' -> leading '00'
        '[^[:digit:]]', ''), -- remove all non-digits
      '^00' , '+'), -- leading '00' -> leading '+'
    '^0', '+49') -- leading '0' -> leading '+49'
  as international_phone
from mytable;

您当然可以在WHERE子句中做到这一点:

SELECT id FROM user WHERE regexp_replace(...) = '+49123456789'

甚至

SELECT id FROM user WHERE regexp_replace(...phone...) = regexp_replace(...'0123456789'...)

为方便起见,您可以为此编写一个PL / SQL函数,并这样使用:

SELECT id FROM user WHERE international_phone(phone) = international_phone('0123456789')

这是针对Oracle的。对于SQL Server可能会有一些相似之处。