我的建议是让标准长度的字符串字段,存储门牌,在这个领域创建索引,然后使用between
搜索。
事情是这样的格式:
NNNNNNCCCCBBBB
其中:
NNNNNN
- 左补齐门牌号码;
CCCC
- 左填充字符(如'11A'中的'A');
BBBB
- 左填充楼号
在“左填充”我的意思是“充满了某种符号在左侧标准长度”,看到select lpad('11',5,'X') from dual;
查询结果的例。
E.g.假设你有“11A高街5号”地址并选择'%'作为填充符号。当转换为建议格式时,它看起来像'%%%11%%%A%%%'
和存储在分隔字段中的“高街”。 接着是用于选择在1到1000之间的所有房屋查询例如:
with address_list as (
select '%%%11%%%A%%%%' bnum from dual union all
select '%1001%%%A%%%%' bnum from dual union all
select '%%%%1%%%A%%%%' bnum from dual union all
select '%%%%1%%%%%%%%' bnum from dual union all
select '%%321%%%A%%%%' bnum from dual union all
select '%1000%%%A%%%%' bnum from dual union all
select '%1000%%QQ%%12' bnum from dual
)
select * from address_list
where
-- from '1 high street'
bnum >= '%%%%1%%%%%%%%'
and
-- less then '1001 high street'
bnum < '%1001%%%%%%%%'
order by
bnum
在实际情况下,最好使用chr(1)
或任何其它不可打印的符号作为用于填充符号。
另一件事是为没有真正的现场存储的搜索构建仅基于功能的索引。
您可以提供有关设置的更多详细信息。你的地址格式是什么,你实际上是否附上空间坐标。我最初的感觉是,而不是街道数量范围,你需要一个箱子或线条几何图形,看看是否有交叉点。 – 2010-07-29 22:59:29