使用不同长度的传入号码(带或不带前缀)进行电话号码查找

2024-01-11

Systems:
-呼叫中心电话系统:来电附有源号码,又名来电显示,又名“ANI”
-SQL Server 2005 - “数据仓库”,在表 [CustDataByANI] 中存储客户电话号码 ([cANI])、客户姓名、位置等
- 存储过程 - 呼叫中心软件将主叫方 ID(又名 ANI)作为参数传递给 SP,SP 使用它在 CustDataByANI 表上执行当前简单的 SELECT 语句....WHERE [cANI] = @ANI。
如果查询找到 @ANI 与“查找表”中包含的 686K cANI 值之一之间的精确匹配,则效果非常好。这种情况发生的概率仅为 12% 左右。

目标:增加成功的“可能/可能”匹配的数量

重要提示:我们使用的是全局数据集,无法强制执行有关任一值(参数 @ANI 或 [cANI] 内的值)长度的规则。
Case 1:
电话系统发送源号码“9876543210”,用作参数@ANI
该确切数字存在于 CustDataByANI 表的 [cANI] 列中(记录号 55555)
Select 语句返回与记录 55555 相关的许多其他列的值 超级简单:WHERE [cANI] = @ANI 成功。

Case 2:
@ANI = '19876543210'(与上面相同,但前面带有“1”)
在 CustDataByANI.cANI 中未找到完全匹配的内容
[cANI] 中最接近的匹配是“9876543210”(仍记录 55555)
即使是孩子也会认识到,与情况 1 的唯一区别是参数 @ANI 中存在 1 位数字“前缀” - 也许它是长途“标签”或国家/地区代码。
这样的前缀长度可能是 1 或 2 甚至 3 位数字......我们无法预测。我们不想考虑长度超过 3 的前缀,但在本例中确实希望返回记录 55555 中的值,如情况 1 所示。

案例 3:案例 2 的“相反”
@ANI = '9876543210'
在 CustDataByANI.cANI 中未找到完全匹配的内容
[cANI] 中最接近的匹配是 '19876543210'(记录#55555现在有一个'1'前缀)
同样,我们假设两者实质上相同。在这种情况下,[cANI] 值由于前缀而包含较长的序列,其长度可能是 1 或 2 甚至 3 位数字......我们无法预测。我们不想考虑长度超过 3 的前缀,但在本例中确实希望返回记录 55555 中的值,如情况 1 所示。

同样,由于每个值的长度(@ANI 和 [cANI])可能存在变化,并且我几乎完全缺乏 SQL 编程,因此我无法为存储过程编写考虑所有 3 种情况的 SELECT 语句。带有通配符的简单“LIKE”语句似乎失败了,我的头在思考 CASE 标准、CONTAINS 甚至 REVERSE 策略,以从右到左的方式“读取”@ANI 和 cANI 值。

我的梦想是归还最佳可能匹配两者之间。
我的愚蠢程序如下;非常感谢任何和所有帮助!

顺便说一句,我的源表 CustDataByANI 确实包含 RevANI 列,它只是 cANI 值的反转。最初,我认为解决方案可能在于反转 @ANI 参数值并在 [RevANI] 列中找到最大匹配,从而在每个参数的右侧保留任何通配符。但我仍然陷入困境,不确定这是否是最好的策略......

USE [GCC]
GO
/****** Object:  StoredProcedure [dbo].[SP_GetCustDataByANI]    Script Date: 10/07/2014 07:47:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[SP_GetCustDataByANI] 
    @ANI varchar(80)
AS
BEGIN

    SET NOCOUNT ON;

--Remove leading zeros from the varchar @ANI. I chose this method rather than risking
--the undesirable introduction of exponential notation when long characters are converted to
--integers and back...

    IF ((LEN(@ANI) > 1) AND (LEFT(@ANI,1)= '0'))
    BEGIN
        SET @ANI = REPLACE(LTRIM(REPLACE(@ANI,'0',' ')),' ','0')
    END

    SELECT Id
        ,cANI
        ,cServiceClass
        ,cCompanyClass
        ,cContactName
        ,cContactDivision
        ,cContactDepartment
        ,cCompanyName
        ,cOrganizationName
        ,cContactCity
        ,cContactStateTerr
        ,cContactCountry
        ,cCompanyIsDistributor
        ,PrefAgentID
        ,PrefAgentID_SQUAL
        ,PrefRegionID_SQUAL
        ,VIP_CC
        ,VIP_TS
        ,TS_ACAT
    FROM [dbo].[CustDataByANI]
    WHERE ([cANI] = @ANI)

如果您想让查询更快,您可以创建一个附加列,其中包含倒序的电话号码,在此列上建立索引,然后使用 LIKE 谓词查询该号码,同时也按倒序传递搜索到的电话号码。这将使查询尽可能快。例如,对于您的示例数据,您可以将其存储在新的ReversedPhoneNumber column:

6543211234     store as: 4321123456
16543211234    store as: 43211234561 
0016543211234  store as: 4321123456100

当你需要查询时6543211234只需将其反转并在反转的列中查看,如下所示

WHERE ReversedPhoneNumber LIKE `6543211234%`

无论以何种格式存储,这都会匹配数字,而且速度非常快,因为它是简单而快速的索引查找。 (ALIKE类似于“开始于”操作将寻找索引以寻找巧合)。

至于您需要应用的附加规则,您比我们更了解数据。只需考虑所有可能的情况并进行一些测试,您就会得到需要应用的规则(不是为了加快速度,而是为了确保正确的匹配)。

您可以在 ETL 过程中反转电话号码。

缺少细节,无法提供更好的建议。

注意:如果无法向现有表添加列和索引,只需创建一个差异表来保存与现有表相关的反转数字。您还可以添加触发器来维护此表

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用不同长度的传入号码(带或不带前缀)进行电话号码查找 的相关文章

  • 优化 SQL Server 上的删除

    Deletesql server 上的有时很慢 我经常需要优化它们以减少所需的时间 我一直在谷歌上搜索一些关于如何做到这一点的提示 并且我发现了各种各样的建议 我想知道你最喜欢和最有效的驯服删除野兽的技术 以及它们如何以及为什么起作用 到目
  • MySQL - 从临时表插入

    这看起来非常简单 但我坚持使用简单的插入语句 见下文 begin work CREATE TEMPORARY TABLE IF NOT EXISTS insert table AS select r resource id fr file
  • 我怎样才能知道oracle 9i中哪些值是数字

    我有这个包含 varchar 的数据库 我想知道哪些记录保存数值 我试过REGEXP COUNT和其他 但我在 9i 上运行 我认为这是针对 10g gt 我怎样才能实现这个目标 I tried select to number my co
  • java ResultSet,使用MAX sql函数

    你好 这就是我想要的 我连接到数据库并检索 UniqueId 列的最大元素 并将其分配给名为 maxID 的整数变量 这是我的方法 int maxID 0 Statement s2 con createStatement s2 execut
  • 在 PL/SQL 中将绑定变量与动态 SELECT INTO 子句结合使用

    我有一个关于 PL SQL 中的动态 SQL 语句中可以使用绑定变量的问题 例如 我知道这是有效的 CREATE OR REPLACE FUNCTION get num of employees p loc VARCHAR2 p job V
  • date_sub 对于 mysql 可以,对于 postgresql 可以

    此查询适用于 mySQL 不适用于 Postgresql select from where id and h gt date sub now INTERVAL 30 MINUTE 错误是 Query failed ERREUR erreu
  • 插入 Hive 表 - 非分区表到具有多个分区的分区表 - 无法插入目标表,因为列号/类型

    当我尝试插入分区表时 出现以下错误 SemanticException 错误 10044 第 1 23 行无法插入目标表 因为列号 类型不同 表 insclause 0 有 6 列 这 3 列已分区 我们不需要任何必须从中转储 存储的过滤器
  • 串行类型的外键 - 确保始终手动填充

    我有两个表 国家和地区 CREATE TABLE Countries id SERIAL name VARCHAR 40 NOT NULL PRIMARY KEY id CREATE TABLE Regions id SERIAL coun
  • Linq To SQL - 拥有和分组依据

    我下面这个查询工作正常 不过我想使用 Linq 来实现它 select u ID u NAME from Task t join BuildingUser bu ON bu ID BUILDING t ID BUILDING join Us
  • PostgreSQL 中“-”处或附近的语法错误

    我正在尝试运行查询来更新用户密码 alter user dell sys with password Pass 133 但因为 它给了我这样的错误 ERROR syntax error at or near LINE 1 alter use
  • 检查两个“select”是否相等

    有没有办法检查两个 非平凡的 选择是否等效 最初我希望两个选择之间有形式上的等价 但是答案在证明 sql 查询等价性 https stackoverflow com questions 56895 proving sql query equ
  • 什么时候应该使用 C++ 而不是 SQL?

    我是一名 C 程序员 偶尔使用 MySQL 来处理数据库 但我的 SQL 知识相当有限 但我肯定愿意改变这一点 目前 我正在尝试仅使用 SQL 查询对数据库中的数据进行分析 但我准备放弃了 转而将数据导入到C 中 用C 代码进行分析 我和同
  • 在 SQL Server 上执行分页的最佳方式是什么?

    我有一个数据库超过200万记录 我需要执行分页以在我的 Web 应用程序上显示 该应用程序每页必须有 10 条记录DataGrid 我已经尝试使用ROW NUMBER 但是这种方式会选择所有 200 万条记录 然后只得到 10 条记录 我也
  • 使用子查询 select 创建新表

    我试图从子查询选择创建一个新表 但出现以下错误 附近的语法不正确 SELECT INTO foo FROM SELECT DATEPART MONTH a InvoiceDate as CalMonth DATEPART YEAR a In
  • 解析带下划线的 SQL Server 数字文字

    我想知道它为什么有效以及为什么它不返回错误 SELECT 2015 11 Result 11 2015 第二种情况 SELECT 2 1 a a 2 1 检查元数据 SELECT name system type name FROM sys
  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • 如何通过SQL查询检查是否有JSON函数?

    有SQL 2016 中的 JSON 函数 https learn microsoft com en us sql t sql functions json functions transact sql例如 JSON VALUE JSON Q
  • SQL 更新 - 更新选定的行

    我正在使用 SQL Server 2008 我有一个名为MYTABLE有两列 ID STATUS 我想编写一个存储过程来返回其记录STATUS是 0 但是这个存储过程必须更新STATUS返回行数为 1 如何在单个查询中执行此选择和更新操作
  • 是否可以引用同一个表中的不同列?

    如果博客有一个 类别 表 如下所示 CREATE TABLE categories id INTEGER PRIMARY KEY AUTO INCREMENT parent id INTEGER NOT NULL name VARCHAR

随机推荐