我有一张包含电话号码约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
答案 0 :(得分:4)
有没有办法确定存储号码的哪个确切部分是扩展名? 或者是存储没有扩展的“基础”数字。 如果是,您可以检查数据库中的号码(没有扩展名)是否是要检查的当前号码的前缀。 前缀表示从头开始的String的子字符串。
但是如果您的数据库中只包含带扩展名的数字,并且无法找出属于它的数字,我相信您无法找到确切的解决方案。
答案 1 :(得分:2)
您可以反转问题并检查数据库中的每个号码,看它是否匹配或前缀来电号码。
,而不是在数据库中查找电话号码。假设您从来电显示中获得了电话号码,例如+431234567891,那么
SELECT name, id
FROM Table
WHERE CHARINDEX(telephonenumber, "+431234567891") > 0;
将返回该公司,如果是+431234567890将返回2条记录
如果您可以处理从客户端返回的两行,您可以使用上述内容。
预处理数据更好(性能明智),但为此您需要更详细地描述数据,例如:
答案 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信息。
唯一的解决方案是为那些可以进行简单前缀搜索的公司维护“基数”。