编写SQL查询以搜索数据库中的类似地址

时间:2014-10-28 16:09:55

标签: sql sql-server tsql sql-server-2012

我试图编写一个查询,它会在数据库中找到类似的地址。

例如,用户可能输入可能不正确的各种地址。应该显示类似的地址作为结果。

例如,用户可能会搜索 -

"177 pleasant street" 

"177 pleasant st"

"177 pleasant road"

我该如何实现?

到目前为止,我已经尝试过了 -

SELECT * FROM Table WHERE Address LIKE '%177 pleasant st%' AND ...etc...

5 个答案:

答案 0 :(得分:1)

我会考虑使用full text search代替。

最大的好处是它有助于拼写(愉快,愉快,愉快等)。当然,它主要基于语言学而非地理学相似来匹配相似性。

答案 1 :(得分:0)

这不是一件容易的事。

您应该提取搜索字符串的实体和存储的字符串,并比较相同类型的实体。

在你的例子中:

  

street_number:字符串的数字部分。

     

street_name:字符串的非数字部分,不包括字典{street,st,road}中的字词

     

如果street_number和street_name MATCH,您可以返回该地址。

对于一般情况提取实体很困难,您可以使用工具来帮助您。

检查:https://developers.google.com/maps/documentation/javascript/geocoding

答案 2 :(得分:0)

SQL Server中的

SOUNDEX函数可以完成基本匹配。

SELECT * FROM [Table] WHERE SOUNDEX([Address]) = SOUNDEX('177 pleasant st')

如果您想通过百分比的关键字匹配&#39; 进一步自定义搜索,您可以去实施 Jaro Winkler算法 < / strong>在存储过程中为您进行匹配。您可以开始阅读有关Jaro Winkler here的内容。否则,如前所述,您可能需要使用匹配工具。

另请查看here

答案 3 :(得分:0)

这取决于你想要达到的目标。通过它的外观无论什么要求,最重要的信息是“177”和“愉快”和“道路”(来自您原始数据库的信息)。因此,如果只有三个搜索参数,那么您可以使用下面的简单查询。如果您想使用更多,那么您将不得不使用全文搜索。

    DECLARE @DataFromUserInterFace varchar(300)
SET @DataFromUserInterFace='177 pleasant street'

SELECT 
[Address] 
FROM
[Employer]
WHERE 
CHARINDEX
(
 substring([Address], 1, CHARINDEX(' ', [Address], 1)-1)
 , @DataFromUserInterFace 
 , 1)!=0
OR 
CHARINDEX
(
substring
([Address]
, CHARINDEX(' ', [Address], 1)+1
, CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)+1)
-CHARINDEX(' ', [Address], 1)-1)
, @DataFromUserInterFace
, 1)
!=0
OR
CHARINDEX
(
substring([Address], CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)+1)+1,
CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)+1)
-CHARINDEX(' ', [Address], CHARINDEX(' ', [Address], 1)-1)
)
, @DataFromUserInterFace
, 1)
!=0

答案 4 :(得分:-1)

如果您将地址标准化一点,任务将变得更容易或至少更准确。将地址分成它自己的表,如下所示:

 Create table Address(
       AddressKey    int not null ,
       addressnumber nvarchar(10), 
       street        nvarchar (50),
       streetSuffix  nvarchar (10)
       ... (city,state,zip,etc.)
       )

然后,您的查询可以指定要搜索相似内容的地址的哪个部分。

Select * 
from table t inner join 
address a on a.addresskey=t.addresskey
Where a.street = 'pleasant'
      and a.streetnumber='177'

注意:我将街道号码作为nvarchar来容纳'23A'类型的东西,但即使这样也可以打破。