私の提案は、建物番号を格納するための標準の長さの文字列フィールドを作成し、このフィールドにインデックスを作成して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)
、パディングのシンボルとして、またはその他の印刷できないシンボルを使用することをお勧めします。
もう1つのことは、実際のフィールドストレージなしで、検索用の関数ベースのインデックスのみを作成することです。