私は pl/sql ではこれを行いません。本当に不要です。
Oracle SQL には REGEXP_SUBSTR、REGEXP_REPLACE、REGEXP_COUNT があります。SELECT 句に入れることができる IF および CASE 式もあります。SQL リファレンスの FUNCTIONS セクションに移動します: http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions.htm#i1482196
データセットには興味深いバリエーションがいくつかあります - 家/建物番号の文字と分数です。あなたが (まだ) 持っていないのは、複数の部分に分かれた通りの名前 (例えば、ここボストンの Melnea Cass Boulevard) や、連結/欠落 (「ブロードウェイ」) または珍しい (「シダー パスウェイ」) の「通り」指示子を持つ通りの名前です。
入力データを保持するリファクタリングされたクエリとして sample_data から始めます。代わりに、おそらくテーブルやビューなどがあります。
今のところ、各通りの名前には 2 つの単語があると仮定しています。REGEXP_COUNT でカウントすることから始めます。これは、単語数として値 WORDS を持つサブクエリ COUNTED_DATA です。入力データ行の最後にスペースがない場合に備えて、入力の各行にスペースを追加して、カウントが正しいことに注意してください。
次のように各単語を検索します
[^ ]+[ ]+
つまり、1 つまたは複数の非スペースの後に 1 つまたは複数のスペースが続きます。あいまいなので、ゼロ以上のスペース ([ ]*) を使用したくありません。
次に、正規表現を使用して、最後の 2 つの単語と最初の (単語から 2 を引いた) 単語を選択します。
結果は次のとおりです。
with sample_data as (
select '5 Kent Street' as addr from dual
union all select '3 A lindt Street' as addr from dual
union all select '2/15 bold Street' as addr from dual
union all select '9/34-36 carmen Road' as addr from dual
union all select '12/5a sandford Street' from dual
)
select
counted_data.addr as "Original Address",
substr (regexp_replace (addr || ' ', '(([^ ]+[ ]+){' || (words-2) ||'})([^ ].*)','\1'), 1, 10) as "Number",
substr (trim (regexp_replace (addr || ' ', '(([^ ]+[ ]+){' || (words-2) ||'})([^ ].*)','\3')), 1, 25) as "Street"
from
(
select sample_data.addr, regexp_count(addr || ' ', '[ ]+') as words
from sample_data
) counted_data
Original Address Number Street
--------------------- ---------- -------------------------
5 Kent Street 5 Kent Street
3 A lindt Street 3 A lindt Street
2/15 bold Street 2/15 bold Street
9/34-36 carmen Road 9/34-36 carmen Road
12/5a sandford Street 12/5a sandford Street
これを読みやすくするために、「substr」を使用して出力列の長さを削減しました。(「COLUMN」はSQL Developerでは機能しません。)