0

この質問はこの質問の一部です

変数を使用してカーソル内のレコードを制限する

元の質問は 2 部構成の質問で、1 部構成は、IS THERE A BETTER WAY TO DO THIS

動作するコードがありますが、非常に遅く、レコードごとに約 2 秒かかります。

2 つのフィールドと約 400 のレコードを持つテーブル NR_POSTAL_ABBR があります。

ReplaceWhat       ReplaceWith
Ave               Avenue
St                Street

別のテーブルの Address フィールドを上のテーブルの値に置き換えられるようにしたい

住所が 123 Main St の場合、123 Main Street と表示されます。

123 Main Street の場合 - 123 Main Street のままで、123 Main Streetreet になるべきではありません

住所を含むテーブルには数百万行ありますが、これを行う高速な方法はありますか?

ありがとうございました

4

2 に答える 2

0

だからあなたが尋ねたように。私の提案は通過することですregular expressions。これがあなたのケースの更新コードです。

フィールド アドレスを含むテーブル テストがあるとします。必要なことは非常に簡単で、要件に一致する正規表現を作成します。

Stだから:すべてを置き換える必要がStreetありAvAvenueこれがあなたがすべきことです。

update test
   set address = 
   regexp_replace(
           regexp_replace(address, 'Av | Av$| Av ', ' Avenue ' ),
                           'St | St$| St ', ' Street ');

SQLFiddle の例を次に示します。

正規表現の説明:

regexp_replace正規表現パターンに基づいて文字列を別の文字列に置き換えます。ドキュメントを参照してください: REGEXP_REPLACE

正規表現については、ここで確認できます。正規表現 Wikiほぼすべての言語がPOSIXパターンに従っているので、一度学べば上手になります。

regexp_replaceあなたが2つの要件を与えたので、私はあなたが望むものを達成するのに慣れていました。関数のパラメータについては書きません。式だけです。

最初の式で、これは次のこと'Av | Av$| Av 'を意味します: PS .:-スペースが見えるように を置きます (無視してください)。だから入れさせてくれません。

  • -Av -(末尾にスペースあり) =Av文字列の後ろにスペースがあるもの をすべて検索
  • -|-or(パイプ記号) =ステートメント に等しい
  • - Av$-=Av前にスペースAvがあり、文字列の最後にある場合はすべて検索します。$
  • - Av -Av=前後にスペースがあるすべてを検索

    次に、関数はこれらの出現のいずれかを単語に置き換えますAvenue。次のようなことを避けるために、前後にスペースを入れていることに注意してくださいPeer HarborAvenue

    同じ説明がSt文字列にも当てはまります

    正規表現関数が気に入った場合は、ここで詳細を確認できます: Oracle 正規表現関数

  • 于 2013-11-02T01:50:56.517 に答える