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)