我们有一个“公司”的SQL Server 2008数据库表,包括姓名,地址,城市,州,邮编和电话
用户访问我们的网络表单,提交他们的信息,我们需要确定他们是否在我们的数据库记录或新公司中。
示例数据
我编写了一个SQL存储过程,它将通过State / Zip,Name,Address,City / Phone检查匹配。这4场比赛之一的任何一次击中都会触发一条记录。
然后,使用VB.NET,我计划根据匹配的匹配来分配点数。例如,名称匹配将是20分......但状态/邮政比赛可能只有5或10分。
示例SQL脚本。
显然,我将使用参数来接收数据点,而不是硬编码。
你会注意到我正在清理地址只是数字值......而且名称是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 != ''
我的问题
有没有更好的方法来编写这个SQL脚本来找到更好的匹配,和/或更准确?
答案 0 :(得分:1)
我们的程序与UI完全相同。如果用户想要查找公司,他们可以搜索姓名,地址或电话号码。通过点系统,你似乎正朝着正确的方向前进。有点创意,这是肯定的(创意是一件好事)。我的建议是,如果可能的话,在UI中添加一个“Locate by”下拉框。这就是我们的程序,你不必添加任何复杂的逻辑。公司名称默认为“定位依据”选项,因此如果用户希望按名称搜索,则无需选择任何内容。当他们这样做时,你想象的SP非常简单明了......将用户输入添加到公司名称的通配符搜索中。通过地址和电话定位相同。
当你想要找到一个条目的最近邻居时,事情变得非常疯狂。例如,用户输入“Hihg Times”并且您想要返回“High Times”。这就是我使用像你描述的点系统的地方。