2

誰かがこの問題について私を助けてくれますか? クライアントアドレスをテーブル ( table CT) に、省略されたデータを持つ可能性のある文字列として保存しています。例: 123 RD. LK略語の可能な通り名を含む別のルックアップ テーブル (テーブル) があります。RD = ROAD. この文字列の完全なアドレスを持つ新しいテーブルを作成したいと思います。

入力:

table CT:

Add1     Add2   Add3
------------------------
123 RD   APT 2  BLDG 1
test DR  null   null
main RD  null   BLDG2


table LK:

abbreviation      completestreet
----------------------------------
RD                road
APT               apartment
BLDG              building
DR                drive

これら 2 つのテーブルを結合して、次のことを実現したいと考えています。

123 ROAD      APARTMENT 2    BUILDING 1
test DRIVE    null           null
main ROAD     null           BUILDING 2
4

1 に答える 1

0

おそらく、正規表現の単語境界regexp_replace一緒に使用するソリューションを見つけたいと思うでしょう: ^||$

with ct as (
  select '123 RD'          add1, 'APT 2' add2, 'BLDG 1' add3 from dual union all
  select '123 3RD street'  add1, 'APT 2' add2, 'BLDG 1' add3 from dual union all
  select 'test DR'         add1, ''      add2, ''       add3 from dual union all
  select 'main RD'         add1, ''      add2, 'BLDG2'  add3 from dual
),
lk as (
  select 'RD'    abbreviation, 'road'       completestreet from dual union all
  select 'APT'   abbreviation, 'apartment'  completestreet from dual union all
  select 'BLDG'  abbreviation, 'building'   completestreet from dual union all
  select 'DR'    abbreviation, 'drive'      completestreet from dual
),
recursion (add1, add2, add3, l) as (
  select add1, add2, add3, 1 l from ct union all
  select regexp_replace(add1, '(^| )' ||abbreviation || '( |$)', '\1' || completestreet || '\2'),
         regexp_replace(add2, '(^| )' ||abbreviation || '( |$)', '\1' || completestreet || '\2'),
         regexp_replace(add3, '(^| )' ||abbreviation || '( |$)', '\1' || completestreet || '\2'),
         l+1
    from recursion join (
            select 
               row_number() over (order by abbreviation) r, 
               abbreviation, 
               completestreet 
             from lk
         ) lk
         on l=r
)
select substrb(add1, 1, 30),
       substrb(add2, 1, 30),
       substrb(add3, 1, 30)
  from recursion
 where l=(select count(*)+1 from lk);
于 2013-08-20T20:20:27.133 に答える