查找电话号码 - 查找带有和不带电话分机的号码

时间:2010-05-04 13:17:20

标签: c# sql regex phone-number

我有一张包含电话号码约130 000条记录的表格。这些数字都是这样形成的+4311234567。这些数字总是包括国际国家代码,当地区域代码,然后是电话号码,有时还包括扩展名。

有一个Web服务,用于检查表中的呼叫者号码。该服务已经有效。但是现在客户想要的是,如果有人从一个已经在数据库中而不是他的扩展名的公司打电话,该服务将返回一些结果。

表的示例。

   **id** | **telephonenumber**    | **name**   
|    1    | +431234567             | company A  
|    2    | +431234567890          |  employee in company A  
|    3    | +4398765432            | company b 

现在如果公司A的某个人使用不同的扩展名调用,例如+43123456777,那么它应该返回id1。但问题是,我不知道扩展有多少位数。它可能有3,4或更多位数。

字符串匹配是否有任何模式?

数据存储在sql2005数据库中。

由于

修改
我从crm系统获得的电话号码。我已经和crm的管理员谈过了,他正试图以不同的格式向我发送数据。

   **id** | **telephonenumber** |**extension**   | **name**   
|    1    | +431234567          |                | company A  
|    2    | +431234567          |      890       |  employee in company A  
|    3    | +4398765432         |                | company b 

7 个答案:

答案 0 :(得分:4)

有没有办法确定存储号码的哪个确切部分是扩展名? 或者是存储没有扩展的“基础”数字。 如果是,您可以检查数据库中的号码(没有扩展名)是否是要检查的当前号码的前缀。 前缀表示从头开始的String的子字符串。

但是如果您的数据库中只包含带扩展名的数字,并且无法找出属于它的数字,我相信您无法找到确切的解决方案。

答案 1 :(得分:2)

您可以反转问题并检查数据库中的每个号码,看它是否匹配或前缀来电号码。

,而不是在数据库中查找电话号码。

假设您从来电显示中获得了电话号码,例如+431234567891,那么

SELECT name, id
FROM Table
WHERE CHARINDEX(telephonenumber, "+431234567891") > 0;

将返回该公司,如果是+431234567890将返回2条记录

  • 公司
  • 实际延期

如果您可以处理从客户端返回的两行,您可以使用上述内容。

预处理数据更好(性能明智),但为此您需要更详细地描述数据,例如:

  • 只有3位和4位数字,
  • 是基数始终为9或10位,
  • 对于有扩展名的公司,您总是至少有一个分机号码......

答案 2 :(得分:2)

答案 3 :(得分:1)

分机中的位数是特定于PBX的。 区号+电话号码中的位数是国家/地区特定的。

一种方法是定义其他规则,例如......

+43123 | 12

...说任何以+43123开头的东西都是12位数字,除此之外的任何东西都是扩展名:这可以让你使用(可配置而不是硬编码的)数据来指定扩展的开始位置

另一种方法可能是坚持对于任何带扩展数字的条目,也应该有相应的数字 - 无扩展名,如“公司A”的例子中所示。

答案 4 :(得分:1)

嗯,我对电话号码系统的理解是,没有两个有效/完整的号码可以存在,其中一个是另一个的前缀。这里常见的恶作剧是将你的号码作为11 05 32或其他东西给出,其中110是德国紧急警察号码。

所以 - 如果您可以更改数据库结构并预处理数据,您可以查找具有相同前缀的数字(如果较长时间以最短的扩展名开始,则先排序它们)。每场比赛都是

  • 基数(最短的一个)
  • 直接号码加分机(所有较长的号码)

如果可能的话,我会在数据库中标记这些内容以便更快地查找。

对于具有常见默认扩展名的情况,此方法不足。在这里,许多公司给出了像1234567-0这样的外部号码,其中0可以用2-4位数的扩展名替换。对于这些情况,我的方法不尽如人意 - 对于您的示例数据,它会起作用吗?

答案 5 :(得分:1)

如果您正在处理来自不同国家/地区的电话号码,那几乎是不可能的。即使在同一个国家,长度也经常变化。如果你知道长度是多少(或者你想保持像ChrisW这样的列表),你可以使用LEFT(字段,x)功能截断电话号码,然后再搜索公司的电话号码。请注意,如果您正在进行连接,它可能会运行得慢得多,因为它必须在每一行上运行该函数。

答案 6 :(得分:-1)

如果没有进一步的信息,这将是不可能的:如果您的表格结构如上,系统无法知道哪个部分是基数,哪个部分是扩展名。因此,对于以“+439”开头的任何(未知)号码,它将返回“公司b”。

编辑(@MarkBooth)

我坚持认为没有额外信息就不可能。只是为了更清楚:假设我们的数据库中有以下信息

...
+43316852132 - ....
+433168731 - Company A (reception)
+433168739999 - Company A, Mr. X
+433168911321 - ....
...

这些数字的结构是+4(316)873 - 1,程序不知道。因此,如果一个数字+43316872133(+43(316)87 21 33带结构)正在调用(它不在数据库中),那么你(以及你的软件:))无法判断它是否属于公司A信息。

唯一的解决方案是为那些可以进行简单前缀搜索的公司维护“基数”。