如何解决Oracle SQL比较字符串并找到匹配的子字符串
我有用冒号分隔的标签,它们与两个表中的两个不同实体相关联。想对标签进行子字符串匹配并关联实体。
Table 1 - Table of issues
Issue ---------------- Tag
Issue 1 -------------- Dual UOM:Serial Control:Material Issue
Issue 2 -------------- Validity rule:Effectivity date
Table 2 - Table of Tests
Test ----------------- Tag
Test 1 --------------- Inventory:Outbound:Material Issue
Test 2 --------------- Items:Single UOM
Test 3 --------------- Items:Dual UOM
Test 4 --------------- Recipe:Validity Rule
Test 5 --------------- Formula:Version control:date
Test 6 --------------- Formula:Effectivity date
现在,对于表1中的每个问题,我需要将其关联的标签与表2中的标签进行比较,并找到适用的测试。
在上述ex中,
问题1-匹配的测试将是测试1,测试3
问题2-匹配的测试为测试4,测试5
所有与问题和测试相关的标签都来自一个通用标签主。
非常感谢提供能够执行此子字符串与子字符串匹配的sql代码段的任何帮助。
解决方法
这里是一个选择:使用INSTR
函数将问题分成几行并将它们与测试标签进行比较。请注意,字母大小写必须匹配。如果不是这样(实际上),请使用lower
或upper
函数。
阅读代码中的注释(为了提高可读性,注释分为几个部分)。
首先采样数据:
SQL> with
2 -- sample data
3 issues (issue,tag) as
4 (select 1,'Dual UOM:Serial Control:Material Issue' from dual union all
5 select 2,'Validity Rule:Effectivity date' from dual
6 ),7 tests (test,tag) as
8 (select 1,'Inventory:Outbound:Material Issue' from dual union all
9 select 2,'Items:Single UOM' from dual union all
10 select 3,'Items:Dual UOM' from dual union all
11 select 4,'Recipe:Validity Rule' from dual union all
12 select 5,'Formula:Version control:date' from dual union all
13 select 6,'Formula:Effectivity date' from dual
14 ),
将问题分成几行(splitiss
),将它们与测试代码进行比较(temp
)
15 -- split issues into rows ...
16 splitiss as
17 (select issue,18 tag,19 regexp_substr(tag,'[^:]+',1,column_value) val
20 from issues cross join
21 table(cast(multiset(select level from dual
22 connect by level <= regexp_count(tag,':') + 1
23 ) as sys.odcinumberlist))
24 ),25 -- ... and now compare them to test tags
26 temp as
27 (select i.issue,i.tag issue_tag,i.val,t.test,t.tag test_tag,28 instr(t.tag,i.val) ins
29 from splitiss i cross join tests t
30 )
返回结果:
31 -- return only test tags which match to separate issues (INS > 0)
32 select t.issue,33 t.issue_tag,34 listagg(t.test,',') within group (order by t.test) matched_tests
35 from temp t
36 where t.ins > 0
37 group by t.issue,t.issue_tag;
ISSUE ISSUE_TAG MATCHED_TESTS
---------- -------------------------------------- --------------------
1 Dual UOM:Serial Control:Material Issue 1,3
2 Validity Rule:Effectivity date 4,6
SQL>
P.S。我相信您为问题2发布了错误的测试标签;应该是4,6
,而不是4,5
。
谢谢,这行得通 我确实将标签分成几行,然后使用了substr,instr匹配。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。