我的建議是讓標準長度的字符串字段,存儲門牌,在這個領域創建索引,然後使用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