我的建议是制作标准长度的字符串字段来存储建筑物编号,在该字段上创建索引,然后between
用于搜索。
像这种格式的东西:
NNNNNNCCCCBBBB
在哪里:
NNNNNN
- 左填充门牌号码;
CCCC
- 左填充字符(如 '11A' 中的 'A');
BBBB
- 左侧填充的建筑物编号
在“左填充”下,我的意思是“在左侧填充了一些标准长度的符号”,例如select lpad('11',5,'X') from dual;
查询结果。
例如,假设您有“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)
或任何其他不可打印的符号作为填充符号。
另一件事是只为搜索构建基于函数的索引,而不需要真正的字段存储。