【问题标题】:Oracle SQL: Pattern Matching with Sub-StringsOracle SQL:使用子字符串进行模式匹配
【发布时间】:2020-12-22 14:29:49
【问题描述】:

我有两张表,TAB1 和 TAB2。

在两个表中都有一列显示子字符串的串联。我想根据这些列加入这两个表。但是,虽然 TAB2 的子字符串必须按指定顺序出现在 TAB1 中,但其他子字符串可以被推入各个子字符串之间。

这是一个例子:

假设我在 TAB2 中有以下子字符串:

A ; B ; C

我想要一个连接,只要在 TAB1 的列中有一个 A,后面跟着一个 B,后面跟着一个 C - 当 A、B、C 之间有其他子字符串时,这并不重要。

连接应该成功,对于以下情况(TAB1' 列显示):

A; A; B; C
A; C; B; C
D; E; A; D; B; C

应该是不成功的,只要A没有跟上B就没有跟上C。例如:

A; B
C; A; B
A; C; B
D; E; A; C

我的问题是否有快速成功的解决方案。如果有任何建议,我将非常高兴。

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

    您可以使用正则表达式。根据您的示例数据,这应该可以工作:

    from tab2 t2 join
         tab1 t1
         on regexp_like(t1.col, replace(t2.col, ';', ';|')
    

    您可能希望在两个字符串的开头都放置分号,尤其是当字符串可能不同时。

    另外,这是一个糟糕的数据结构。似乎您将多个值存储在单个列中。这不是在 SQL 中存储数据的最佳方式。

    【讨论】:

      【解决方案2】:

      在连接条件中,我使用 regexp_replace 函数将空格和分号替换为 '%' 字符,然后用相同的字符 '%' 填充两边,然后使用 like 运算符匹配 table1 中的所有所需行

      select t1.col1--, t2.col2
      from tab1 t1
      join tab2 t2 on col1 like '%'||regexp_replace(t2.col2, '\s*;\s*', '%')||'%'
      ;
      

      【讨论】:

        猜你喜欢
        • 2013-09-08
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-06
        相关资源
        最近更新 更多