2016-08-17 4 views
0

私は興味深い謎に少し助けを探しています。ちょうど可変長のIDが準拠していないテキストフィールドに埋め込まれていることが判明しました。このIDはシステムリンケージにとって重要です。合理的に正確な4〜12桁の数値IDのリストが維持されているため、説明付きメモフィールド内のIDに埋め込まれたIDと一致する可能性があります。VarChar2(30)ORACLE:埋め込まれたIDと一致する参照をパーズします

ターゲットプラットフォームはOracle 12c & DataStage 8.5これを実行する。希望する結果は、適切な4〜12桁の数値IDを持つ列を単純に持つことであり、一致しない場合はnullがリストされます。

文字列内の連続番号のNOT_DESC文字をスキャンします。数値ストリングの各項で、ルックアップリストに対する結果値をチェックします。何かのようなもの loop1(テーブル内の各行)... loop2(各NOTE_DESC文字)...数値の場合は、loop3(各listvalue)を入力して、リスト内の各数値を入れ子にしたif文でチェックして長さを削除する(regexp_substr(substrこの方法は、ルックアップリストに何百ものものがあるので、リソース集約的です。誰かがこのような問題に近づいたり、この問題を解決するコードを持っているなら、私は不思議です。

データ例:異なるIDSの 独立維持ルックアップリスト:{123、1234、5678、12345、123456、1234567}なお、ここでNOTE_DESCフィールドの例のリストは次のとおり

  • JS 1234クローズドは(一致1234の所望の結果を有する)
  • 123456月の裁定(123456、所望の結果に一致)バル5678(5678の所望の結果と一致)
  • 12-3バル調整(一致従ってヌル結果)を閉じる
  • 1-23-45ジョンソン(マッチしないので、ヌル結果)
  • ベンダー123489(ノーマッチので、ヌル結果)
+0

重要ですか?おそらくNOTE_DESCフィールドに表示される順序の最初のものでしょうか?または、IDに優先順位がありますか?または、NOTE_DESC値が複数のIDと一致する場合、結果に複数の行があるはずですか?また、2345は23と234の両方に一致します(また45も同様)。または、連続した数字の完全な文字列が一致している場合にのみ一致します(数字の "部分文字列"は見られなくてはなりません)?私の例では、2345だけが一致するが、234はABC2345-200と一致しないだろうか? – mathguy

答えて

0

これは、(あるいはない場合があります)ヘルプ。最初に、WITH句(CTE、ファクタド・サブクエリ)によって2つの「テーブル」を構築します。私は2つのマッチを持つものを含め、より多くのテストのためにnote_descにいくつかの文字列を追加しました。

次に、note_descidx列)での順序を追跡しながら、最大桁の部分文字列を抽出してデータを準備します。最後に、note_descから抽出した個々のIDをidsテーブルのIDと比較し、最後にnote_desc "テーブル"を使用して右外部結合を行い、一致しなかった文字列の行を追加します。

実際には、idx = 1(各文字列の最初の一致が必要な場合のみ)にフィルタをかけ、出力にidx列を表示しないように選択できます。私はそれらを両方に残して、すべてのものがどのように見えるかを見ました。あなたが必要でないものを取り除く。

with 
    note_desc (str) as (
     select 'JS 1234 Closed'   from dual union all 
     select '123456 May Adjudication' from dual union all 
     select 'Closing Bal 5678'  from dual union all 
     select '12-3 Bal Adjustment'  from dual union all 
     select '1-23-45 Johnson'   from dual union all 
     select 'Vendor 123489'   from dual union all 
     select '2345'     from dual union all 
     select ''      from dual union all 
     select 'abckm'     from dual union all 
     select '1234-5678 xyz'   from dual 
    ), 
    ids (id) as (
     select 123  from dual union all 
     select 1234 from dual union all 
     select 5678 from dual union all 
     select 12345 from dual union all 
     select 123456 from dual union all 
     select 1234567 from dual 
    ), 
    prep (str, idx, id) as (
     select str, level, regexp_substr(str, '\d+', 1, level) 
     from note_desc 
     connect by regexp_substr(str, '\d+', 1, level) is not null 
       and prior str = str 
       and prior sys_guid() is not null 
    ) 
select n.str, p.idx, p.id 
from     prep  p 
      inner join ids  i on p.id = i.id 
     right outer join note_desc n on n.str = p.str 
; 

出力(注文していない; NULLを注意してください)複数の一致がある場合は、それを拾いますどの

STR       IDX ID 
----------------------- ---------- -------- 
1234-5678 xyz     1 1234 
1234-5678 xyz     2 5678 
123456 May Adjudication   1 123456 
Closing Bal 5678     1 5678 
JS 1234 Closed     1 1234 

Vendor 123489 
12-3 Bal Adjustment 
1-23-45 Johnson 
2345 
abckm 

11 rows selected. 
関連する問題