2011-07-14 102 views
0

我有一个数据库,用户可以在其中搜索地址。但是,数据库中的某些地址列在一个范围内。例如,120-125主st可以是数据库中的记录。如果用户搜索123 Main St,是否有办法让120-125记录显示出来?这需要相当动态地包含所有范围,所以我不确定BETWEEN子句是否能够正常工作。有任何想法吗?搜索任意范围内的值

+0

你能否提供一个你的数据是什么样子的样本,以及你喜欢什么样的样子?谢谢! – jworrin

回答

1

为自己节省许多许多令人头痛的问题,并为此类数据制作专用字段。你甚至可以创建解析地址,填补了触发的帮助下,这些领域(后插入,更新)功能:

create function rangeFrom(@address varchar(100)) returns int as 
begin 
    declare @pos int 

    set @address = replace(@address, ' ', '') + '.' 

    set @pos = patindex('%[0-9]%', @address) 
    if @pos > 0 
    begin 
    set @address = right(@address, len(@address) - @pos + 1) 
    set @pos = patindex('%[0-9][^0-9]%', @address) 
    return left(@address, @pos) 
    end 
    return null 
end 
-- ------------------------------------------------------------ 
create function rangeTo(@address varchar(100)) returns int as 
begin 
    declare @pos int 

    set @address = replace(@address, ' ', '') + '.' 

    set @pos = patindex('%[0-9]-[0-9]%', @address) 
    if @pos > 0 
    begin 
    set @address = right(@address, len(@address) - @pos - 1) 
    set @pos = patindex('%[0-9][^0-9]%', @address) 
    return left(@address, @pos) 
    end 
    return null 
end 

后来,你可以打电话给他们(例如,在你的触发):

select dbo.rangeFrom('120-125 main st') -- returns 120 
select dbo.rangeTo('120-125 main st') -- returns 125 

这样您就可以使用BETWEEN运算符使用实际字段。

+0

谢谢,我对此有点新,所以我不确定语法如何。这两个函数都应该作为存储过程创建,然后在实际的SQL查询中调用是否正确? – Aeonstrife

+0

@Aeonstrife:它们将在您执行这些语句的数据库中作为[用户定义的函数](http://msdn.microsoft.com/en-us/library/ms191007.aspx)(不是存储过程)创建。之后,您可以使用它们,例如在触发器中,或者在插入或更新行时显式使用它们。 – Tomalak

0

您可以使用正则表达式从地址栏中的“x-y Main Street”中提取x和y的值,然后检查您的搜索值是否在两个提取的值之间。

匹配ZIP /邮政编码,以确保您在地理上查找同一条街道上的记录(这也应该防止重叠范围)。

不知道如果没有在单独的列中定义范围,您将能够做到这一点,我的解决方案并不精彩,但希望它可以帮助你,如果你被迫使用字符串操作。