搜索任意范围内的值

时间:2011-07-14 16:33:26

标签: sql-server

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

2 个答案:

答案 0 :(得分: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运算符实际的字段。

答案 1 :(得分:0)

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

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

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