1

1つのテーブルの文字列を別のテーブルの2つの列に分割する必要があります。数と規則にはいくつかの異なる種類がありますが、明確な区切り文字はありません。SUBSTRとINSTRの組み合わせを使用できますか、それともすべてのルールを満たすためにPL / SQLでif-thenループを使用する必要がありますか?

入力テーブル

5 Kent Street 
3 A lindt Street
2/15 bold Street 
9/34-36 carmen Road
12/5a sandford Street

結果

Number  |Street
--------------------
5       |Kent Street
3A      |lindt Street
2/15    |bold Street
9/34-36 |carmen Road
12/5a   |sandford Street
4

2 に答える 2

2

私は 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では機能しません。)

于 2012-04-14T16:22:27.240 に答える
0

次の 3 つの可能性を提案できます。

  1. 区切り文字が明確で単純な場合は、SUBSTR と INSTR の組み合わせを提案するように使用します。

  2. データベースが正規表現機能をサポートしていて、住所フィールドと正規表現を単純に照合できる場合は、それを使用します。たとえば、MySQL にはREGEXPがあります。

  3. ただし、文字列の解析が複雑でバリアントが多すぎる場合は、完全なプログラミング言語で外部スクリプトを使用してください。

    Java などでデータベースに接続し、文字列を処理して結果を新しいテーブルに挿入します。行数が非常に多い場合は、一括操作を使用することを忘れないでください。これにより、高速になります。

于 2012-04-14T04:11:43.893 に答える