与Oracle部分匹配

时间:2019-02-18 07:14:04

标签: sql oracle pattern-matching match

我有以下记录

主字符串

abc,def,ghi,jkl,mno

记录

abc,ghi,xyz
bbb,jkl
abc,ghi,mno
bbb,ggg

每个记录都是来自另一个查询的连接字段。 (第一条记录是“ abc”,“ ghi”和“ xyz”的串联)。

从上面,我应该确认字符串中的字段是否包含与主字符串的匹配项。在这种情况下,前三个记录是匹配的,因为它们每个都有至少一个与主字符串匹配的字段。

是否可以使用单个查询来处理此问题?我能想到的唯一方法是将每个记录分解成各个部分并分别进行匹配,但我希望有一个更有效的解决方案。我似乎也不能使正则表达式与此一起工作。

1 个答案:

答案 0 :(得分:0)

您需要重新绑定master字符串。幸运的是,您无需触摸record记录。

此解决方案部署正则表达式将主字符串拆分为令牌。这些交叉连接到令牌。我们使用instr()来查看令牌是否存在于记录的字符串中,并将结果汇​​总以产生一个记录,每个record带有Y / N标志。

with m as ( 
    select regexp_substr(str,'[^,]+', 1, level) as tkn
    from master_t
    connect by level <= regexp_count(str, ',')+1
)
select r.str
       , max(case when instr(r.str, m.tkn) > 0 then 'Y' else 'N' end) as in_str
from m
     cross join record_t r
group by r.str
/

显然,此解决方案假定您正在处理表。关于您的数据结构,这个问题有点含糊。希望您可以将此答案应用于自己的情况,但是如果您需要进一步的帮助,请编辑您的问题以进行澄清。