ORACLE:解析嵌入式Id和匹配查找

时间:2016-08-17 20:21:31

标签: oracle

我正在寻找一个有趣的谜语的一点帮助。刚发现变量长度id嵌入在不符合要求的文本字段中。此ID对于系统链接至关重要。有一个4-12位数字id的维护列表,它相当准确,因此可以在描述性注释字段VarChar2(30)中与嵌入的id内匹配

我的目标平台是Oracle 12c& DataStage 8.5执行此操作。所需的结果是只需要一个具有适当的4-12位数字id的列,并列出任何非匹配的null。

扫描NOTE_DESC字符以查找字符串中的连续数字。在数字字符串的每个项中检查结果值对查找列表。就像是 loop1(表中的每一行)... loop2(每个NOTE_DESC字符)...如果是数字然后输入loop3(每个listvalue)来检查列表中的每个数字,用嵌套的if语句删除长度(regexp_substr(substr(trim(t .NOTE_DESC),<>,6),'[0-9] +'))=<>

这种方法是资源密集型的,因为查找列表中有数百个。我很好奇是否有人遇到过这样的问题,或者有任何代码可以解决这个问题。

数据示例: 独立维护的查找不同IDS的列表:{123,1234,5678,12345,123456,1234567}同时这里是NOTE_DESC字段示例的列表:

  • JS 1234已关闭(符合1234的预期结果)
  • 123456 5月判决(符合123456的预期结果)
  • 关闭Bal 5678(符合5678的预期结果)
  • 12-3 Bal调整(不匹配因此无效)
  • 1-23-45约翰逊(不匹配,因此无效)
  • 供应商123489(不匹配因此为空结果)

1 个答案:

答案 0 :(得分:0)

这可能(或可能不)帮助。首先,我建立两个"表"通过WITH子句(CTE,因子子查询)。我向note_desc添加了一些字符串以进行更多测试,包括一个有两个匹配的字符串。

然后我"准备"数据通过提取最大数字子串,在note_descidx列)中跟踪它们的顺序。最后,我比较个人" id" s"从note_desc中针对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.