比较两个不同的oracle表中的两个逗号分隔列

时间:2012-11-08 22:25:12

标签: oracle compare

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

例如 -

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

    这不应该作为a,包含第2列中的c和b返回 在第1栏内,无论其顺序如何。

  2. 第1列有一个,cl,owd 第2列有一个,owd,pp

    应返回此行,因为第2列的“pp”不是 包含在第1栏中。

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

    不应退回此行。

  4. 我可以在SQL中完成此操作吗?不期待程序或功能。

    感谢所有帮助!!

1 个答案:

答案 0 :(得分:2)

首先:我认为您的示例与您的问题不符。

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

您需要将csv解析为集合(regexp_substr部分),然后检查第2列中的集合是否完全包含第1列中的集合(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