Я предлагаю создать строковое поле стандартной длины для хранения номеров зданий, создать индекс для этого поля и затем использовать between
для поиска.
Примерно такой формат:
NNNNNNCCCCBBBB
где:
NNNNNN
- номер дома с левой стороны;
CCCC
- символ с левой стороны (как 'A' в '11A');
BBBB
- слева-номер здания с мягкой подкладкой
Под «левой подкладкой» я подразумеваю «заполненный символом стандартной длины с левой стороны», см., например, результат запроса select lpad('11',5,'X') from dual;
.
Например, предположим, у вас есть адрес "11A high street building 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)
или любой другой непечатаемый символ в качестве символа для заполнения.
Другая вещьзаключается в создании только функционального индекса для поиска без реального хранения полей.