2016-08-03 4 views
0

私はOracleへの初心者だと私は、文字列から米国のストリートアドレスを解析する必要がありますを削除し、私は正規表現SUBSTRとオプションのカップルを試みたが、私は望ましい結果が得られませんでした。ここで解析・ストリートは、Oracle住所、不要なテキスト

は、テキスト文字列から数例です。

XYZ 123 SEスターク回目のスーツ401
XYX 123第39 AVE NE第二FLRのn-3
XYZ 213ネブラスカ勇気の道E-1

そして、私の出力は次のようになります。
123 SEスタークST
123これまでの第39回AVE NE
213ネブラスカ勇気の道

マイSQL:

SELECT UPPER (
      REGEXP_SUBSTR (REPLACE ('xyz 2551 38th ave ne tc 2', 'xyz '), 
         '((^[0-9]{1,9}+[ ]+[0-9]{1}[/]+[0-9]{1})|(^[0-9]+))')) 
      AS houseno, 
     TRIM (
      UPPER (
      REGEXP_SUBSTR (
       REPLACE ('xyz 2551 38th ave ne tc 2', 'xyz '), 
       '[^0-9]+((1()st|1st)|(2()nd|2nd)|(3()rd|3rd)|([1234567890]+()th|[1234567890]+th)) +(ave(nue)?|st(reet)?|boulevard|blvd)[[:print:]]*|P(.)O(.)()+Box()[0-9]+|[a-z][[:print:]]*', 
       1, 
       1, 
       'i'))) 
      AS street_addrerss,  
     UPPER (REPLACE ('xyz 2551 38th ave ne tc 2', 'xyz ')) AS orginal_text 
    FROM DUAL; 

ありがとうございます!

+0

これは不公平に聞こえます。あなたが見せているように文字列からアドレスを抽出することは非常に難しい問題です。オラクルの初心者にそれを与えました。解決方法についての示唆はありませんでした。あなたはどのように住所と何が「不要なテキスト」であるかを認識することになっていますか?彼らはそれに対して何らかの規則を与えましたか? – mathguy

+0

stringからストリート・アドレスを抽出し、このデータをOracle DBにロードする必要があります。彼らは住所行2を心配していません。 – nissamps

+0

私の質問は分かりやすいと思っていましたが、もう一度やり直します。あなたの入力文字列を見ることで、住所(行1)の始まりと終点を知る方法は?たとえば、「アドレスは文字列の最初の桁で始まります」と言うことができます。けっこうだ;これはアドレスの前に "ガベージ"に数字を入れることができないということですか?いつまで?それが保証されていれば、それは良いと便利です。次に、アドレスENDSと残りの "ゴミ"の開始位置をどのように決定しますか? – mathguy

答えて

0

はやや一般的なアプローチである...それは(アドレスは数字を含んでいないかもしれないので、前に「役に立たない」のテキスト)のアドレスが文字列の最初の数字から始まると仮定し、そのアドレスは常にで終わりますst、str、通り、av、ave、道、道、rt、ルート、blvd、またはそれらの後の期間なし。他の多くの可能性があるので、このリストを維持する必要があります。

また、入力文字列のすべてが小文字であることを前提としています(そうでない場合、入力文字列にlower_caseを適用してから結果のアドレスに初期化することができます)。端末のピリオド(。)が不要な場合は、アドレスに含まれているかどうかにかかわらず、削除することができます。検索文字列の最後から。

with 
    input_strings (str) as (
     select 'xyz 123 se stark st suit 401'  from dual union all 
     select 'xyx 123 39th ave ne 2nd flr n-3' from dual union all 
     select 'xyz 213 nebraska courage way e-1' from dual union all 
     select '2 new way blvd. apt 33'   from dual 
    ) 
select regexp_substr(str, '\d.*(st|str|street|av|ave|avenue|way|rt|route|blvd).?') 
                       as address 
from input_strings 
; 

ADDRESS 
------------------------------ 
123 se stark st 
123 39th ave 
213 nebraska courage way 
2 new way blvd. 
+0

ありがとう、それは働いた。残りの可能な終了文字列を追加して、望みの結果を見ることができました。 – nissamps

-1

最初のスペースのスペース番号5

位置があるまで、あなたが最初のスペースアップの後、すべてを返すようにしたいと仮定すると:instr(<string>,' ',1,1)第五スペースの 位置は次のとおりです。instr(<string>,' ',1,5)

は、取得するためにSUBSTR関数を使用しますあなたが必要とする文字列の一部。ここで

select substr('xyz 123 se stark st suit 401' 
      ,instr('xyz 123 se stark st suit 401', ' ') + 1 
      ,instr('xyz 123 se stark st suit 401', ' ', 1, 5) - instr('xyz 123 se stark st suit 401', ' ') - 1) 
    from dual 
+0

これは実行可能な解決策ではありませんが、私は特定のシナリオでは動作しますが、私が持っているデータのすべてではないことに同意します。 – nissamps