0

我想将 oracle 表中的逗号分隔列与不同表中的另一个逗号分隔列进行比较。如果第一列中的所有值(在逗号分隔的列中且无论它们的顺序如何)都包含在第二列中,则不应返回该行。

例如 -

  1. 第 1 列有 a,b,c,def 第 2 列有 a,c,b

    这不应返回,因为第 2 列中的 a、c 和 b 包含在第 1 列中,无论它们的顺序如何。

  2. 第 1 列有 a,cl,owd 第 2 列有 a,owd,pp

    应该返回此行,因为第 2 列的 'pp' 不包含在第 1 列中。

  3. 第 1 列有 vvv,ccc,rr 第 2 列有 ccc,rr

    不应返回此行。

我可以在 SQL 中完成这个吗?不期望过程或功能。

感谢所有的帮助!

4

1 回答 1

2

第一:我认为您的示例与您的问题不符。

但专注于您的问题:如果第一列的所有值(在逗号分隔的列中且无论它们的顺序如何)都包含在第二列中,则不应返回该行。

您需要将 csv 解析为一个集合(regexp_substr部分),然后检查第二列的集合是否完全包含第一列(minus部分)的集合:

SELECT *
  FROM csv
 WHERE EXISTS
         (SELECT REGEXP_SUBSTR (col1, '[^,]+', 1, ROWNUM)
            FROM DUAL
           CONNECT BY ROWNUM <= LENGTH (col1) - LENGTH (REPLACE (col1, ',')) + 1
          MINUS
          SELECT REGEXP_SUBSTR (col2, '[^,]+', 1, ROWNUM)
            FROM DUAL
          CONNECT BY ROWNUM <= LENGTH (col2) - LENGTH (REPLACE (col2, ',')) + 1
         )
;

有关工作示例,请参见http://www.sqlfiddle.com/#!4/3cdb3/1 。

于 2012-11-09T06:56:13.933 回答