【问题标题】:Partial matching with Oracle与 Oracle 部分匹配
【发布时间】:2019-02-18 07:14:04
【问题描述】:

我有以下记录

主字符串

abc,def,ghi,jkl,mno

记录

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

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

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

有没有办法使用单个查询来处理这个问题?我能想到的唯一方法是将每条记录分解为其组件并单独匹配它,但我希望有一个更有效的解决方案。我似乎也无法使用正则表达式来处理这个问题。

【问题讨论】:

  • 结果集是这样提供的 - 我无法对源数据做任何事情很抱歉......

标签: sql oracle pattern-matching match


【解决方案1】:

您需要重新原子化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
/

显然,此解决方案假定您正在处理表格。关于您的数据结构,这个问题有点含糊。我希望您能够将此答案应用于您的情况,但如果您需要进一步的帮助,请编辑您的问题以提供说明。

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 2014-08-12
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 2015-12-31
    相关资源
    最近更新 更多