SQL按名称和地址查找可能的匹配项

时间:2014-02-06 15:12:33

标签: sql search stored-procedures find match

我们有一个“公司”的SQL Server 2008数据库表,包括姓名,地址,城市,州,邮编和电话

用户访问我们的网络表单,提交他们的信息,我们需要确定他们是否在我们的数据库记录或新公司中。

示例数据

enter image description here

我编写了一个SQL存储过程,它将通过State / Zip,Name,Address,City / Phone检查匹配。这4场比赛之一的任何一次击中都会触发一条记录。

然后,使用VB.NET,我计划根据匹配的匹配来分配点数。例如,名称匹配将是20分......但状态/邮政比赛可能只有5或10分。

示例SQL脚本

  1. 显然,我将使用参数来接收数据点,而不是硬编码。

  2. 你会注意到我正在清理地址只是数字值......而且名称是alphas。

    WITH 
    
    Match_StateZip as (
        select ID
        from vwCompanies
        where State = 'IA' and ZipCode like '25885%'
    ),
    Match_Name as (
        select ID
        from vwCompanies
        where Name like 'Best%Service%Ever%'  /* Excluded Corp, Ltd, Inc, and non-alpha */
    ),
    Match_Address as (
        select ID
        from vwCompanies
        where AddressLine1 like '%0429%9%' /* Only Numeric Portion */
    ),
    Match_CityPhone as (    
        select ID
        from vwCompanies
        where   City like 'Fort%Lauderdale%' and MainPhone like '%658%' /* First 3 (not area code) */
    )
    
    
    select comp.ID, Name, MainPhone, AddressLine1, City, State, ZipCode, 
        m_sz.ID 'm_sz', m_n.ID 'm_n', m_a.ID 'm_a', m_cp.ID 'm_cp'
    from vwCompanies comp
    left join Match_StateZip m_sz   on comp.ID = m_sz.ID
    left join Match_Name m_n        on comp.ID = m_n.ID
    left join Match_Address m_a     on comp.ID = m_a.ID
    left join Match_CityPhone m_cp  on comp.ID = m_cp.ID
    
    where m_sz.ID != '' OR m_n.ID != '' OR m_a.ID != '' OR m_cp.ID != ''
    
  3. 我的问题

    有没有更好的方法来编写这个SQL脚本来找到更好的匹配,和/或更准确?

1 个答案:

答案 0 :(得分:1)

我们的程序与UI完全相同。如果用户想要查找公司,他们可以搜索姓名,地址或电话号码。通过点系统,你似乎正朝着正确的方向前进。有点创意,这是肯定的(创意是一件好事)。我的建议是,如果可能的话,在UI中添加一个“Locate by”下拉框。这就是我们的程序,你不必添加任何复杂的逻辑。公司名称默认为“定位依据”选项,因此如果用户希望按名称搜索,则无需选择任何内容。当他们这样做时,你想象的SP非常简单明了......将用户输入添加到公司名称的通配符搜索中。通过地址和电话定位相同。

当你想要找到一个条目的最近邻居时,事情变得非常疯狂。例如,用户输入“Hihg Times”并且您想要返回“High Times”。这就是我使用像你描述的点系统的地方。