簡體   English   中英

使用不同長度的傳入號碼(帶或不帶前綴)查找電話號碼

[英]Phone number lookups using incoming numbers of varying lengths, with or without prefixes

系統:
-呼叫中心電話系統:傳入呼叫以及源號碼,主叫方ID(又稱“ ANI”)
-SQL Server 2005-“數據倉庫”,用於在表[CustDataByANI]中存儲客戶電話號碼([cANI]),客戶名稱,位置等
-存儲過程-呼叫中心軟件將呼叫者ID(又稱ANI)作為參數傳遞給SP,該參數使用它在CustDataByANI表上執行當前簡單的SELECT語句。...WHERE [cANI] = @ANI。
如果查詢找到@ANI與“查找表”中包含的686K cANI值之一之間的精確匹配,則此方法效果很好。 這種情況僅發生大約12%的時間。

目標:增加成功的“可能/可能”比賽的次數

重要說明:我們使用的是全局數據集,因此無法執行有關任一值(參數@ANI或[cANI]中的值)長度的規則。
情況1:
電話系統發送源號碼“ 9876543210”,用作參數@ANI
該確切數字存在於CustDataByANI表的[cANI]列中(記錄號55555)
Select語句從與記錄55555 Super-easy關聯的許多其他列中返回值:WHERE [cANI] = @ANI成功。

情況2:
@ANI =' 1 9876543210'(與上述相同,但前導'1')
在CustDataByANI.cANI中找不到完全匹配的項
[cANI]中最接近的匹配是'9876543210'(仍然記錄55555)
甚至一個孩子都會意識到,與案例1的唯一區別是參數@ANI中存在一個1位數的“前綴”-也許是長途“標簽”或國家/地區代碼。
這樣的前綴長度可能是1或2或什至3位數。...我們無法預測。 我們不想考慮大於3的前綴,但是在這種情況下,確實希望像情況1一樣從記錄55555返回值。

案例3:案例2的“反向”
@ANI ='9876543210'
在CustDataByANI.cANI中找不到完全匹配的項
[cANI]中最接近的匹配是' 1 9876543210'(記錄#55555現在具有'1'前綴)
再一次,我們將假定兩者是實質等同的。 在這種情況下,由於前綴,[cANI]值包含更長的序列,長度可能是1或2甚至是3位數...我們無法預測。 我們不想考慮大於3的前綴,但是在這種情況下,確實希望像情況1一樣從記錄55555返回值。

同樣,由於每個值(@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列中:

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

當您需要通過6543211234查詢時,只需對其進行反向查詢, 6543211234在反向列中查找如下所示

WHERE ReversedPhoneNumber LIKE `6543211234%`

這將與存儲的任何格式的數字都匹配,並且匹配速度非常快,因為這是一種簡單而快速的索引查找。 (類似於“開始於”操作的LIKE會尋找索引來尋找巧合)。

至於您需要應用的其他規則,您比我們更了解數據。 只需考慮所有可能的情況並進行一些測試,您就會獲得需要應用的規則(不要加快速度,但要確保正確的匹配)。

您可以在ETL過程中沖銷電話號碼。

缺少詳細信息可以提供更好的建議。

注意:如果無法將列和索引添加到現有表中,則只需創建一個差異表來保存與現有表相關的反向編號。 您還可以添加觸發器來維護此表

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM