2010-07-29 136 views
0

我正在尋找更好的方式來搜索Oracle Text中的數字範圍。我有一個數據庫應用程序,它執行很多GIS類型的事情,但我們現在想要爲它添加街道範圍搜索。Oracle文本搜索範圍

所以我想將最小值和最大值存儲在一列中,然後在這些值中搜索一個數字。我很樂意去探索選擇,但我想要指出哪裏可以找到答案。有沒有人對我有任何建議?

編輯:我們只是試圖使地址查找更容易。地址部分的文本取得了巨大成功,但我們希望存儲街道範圍而不是每個單獨的門牌號碼。 因此,如果我搜索「11高街」,如果高街的範圍在1到1000之間,我會期待一場比賽。我還想要一些可以使用的選項,如果我搜索「flat 1 11 high街道「,雖然。我期望在這些情況下我將不得不對這些輸入做一些調整,我只想知道我可以嘗試使用哪種工具。

+0

您可以提供有關設置的更多詳細信息。你的地址格式是什麼,你實際上是否附上空間座標。我最初的感覺是,而不是街道數量範圍,你需要一個箱子或線條几何圖形,看看是否有交叉點。 – 2010-07-29 22:59:29

回答

2

我的建議是讓標準長度的字符串字段,存儲門牌,在這個領域創建索引,然後使用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)或任何其它不可打印的符號作爲用於填充符號。

另一件事是爲沒有真正的現場存儲的搜索構建僅基於功能的索引。

2

任何問題

WHERE <number> BETWEEN minColumn AND maxColumn 
+0

通常街道號碼不是(數字)。我住在11號,我旁邊的房子是11A。 – 2010-07-29 22:54:57

+0

11A是一個數字。11A對於282 bro只是十六進制 – nothingisnecessary 2017-03-22 21:14:19