1

regexp_replace を使用して郵送先住所を標準化していますが、問題が発生したことがあります。

次の 2 つのアドレスと、その結果がどうなるかを考えてみましょう。

  • 115 1/2 東 6 丁目 -> 115 1/2 東 6 丁目
  • 818 東通り -> 818 東通り

2 番目の住所の「東」は、方向標識ではなく、通りの実際の名前です。

私のクエリでは、私は試みました

SELECT
     regexp_replace(address, 'East[^ St]', 'E ')

しかし、これは最初のアドレスを適切な形式に変換できません。

East という単語が最初のアドレスで「E」に変換され、2 番目のアドレスでは単語がそのまま残るように regexp_replace を記述するにはどうすればよいですか?

4

2 に答える 2

2

現在のパターンEastは、スペース、、、Sまたはt. 「East」が「St」の前に来ないようにするために、おそらく否定先読みを使用するつもりだったと思いますが、残念ながらOracleは否定先読みをサポートしていません。代わりに、REGEXP_REPLACE を条件付きにする必要があります。

CASE
    WHEN address LIKE '%East%' AND address NOT LIKE '%East St%'
        THEN REGEXP_REPLACE(address, your_pattern, your_replacement)
    ELSE address
END
于 2016-02-24T17:36:57.230 に答える
1

これは REGEXP_REPLACE() であなたの質問に答えます。文字列' EAST'('east' が別の単語の末尾であるケースをキャッチしたくない) の後に、スペース、1 つ以上の文字、別のスペース、および'St'グループで記憶されている文字列が続きます。見つかった場合は' E'、2 番目に記憶されたグループ (スペースの後に 1 つ以上の文字が続き、その後にスペースと'St'.注: さまざまなテスト形式を追加したことに注意してください (常に予期しないものもテストしてください!)。

SQL> with tbl(address) as (
     select '115 1/2 East 6th St'       from dual union
     select '115 1/2 NorthEast 6th St'  from dual union
     select '115 1/2 East 146th St'     from dual union
     select '115 1/2 East North 1st St' from dual union
     select '818 East Ave'              from dual union
     select '818 Woodward'              from dual union
     select '818 East St'               from dual
   )
   select regexp_replace(address, '( East)( .+ St)', ' E\2') new_addr
   from tbl;

NEW_ADDR
------------------------------------------------------------------------
115 1/2 E 146th St
115 1/2 E 6th St
115 1/2 E North 1st St
115 1/2 NorthEast 6th St
818 East Ave
818 East St
818 Woodward

7 rows selected.
于 2016-02-24T22:51:09.937 に答える