2010-07-29 132 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