【问题标题】:Compare two comma-separated columns in two different oracle tables比较两个不同 oracle 表中的两个逗号分隔列
【发布时间】:2012-10-29 05:36:16
【问题描述】:

我想将 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 中完成此操作吗?不期望过程或函数。

感谢大家的帮助!!

【问题讨论】:

  • 这些规则很混乱,文本中的描述与示例不匹配。
  • 您首先不应该将逗号分隔的值存储在单个列中。如果你重新设计你的数据模型(即解决根本原因)而不是与错误设计的症状作斗争会更好。

标签: oracle compare


【解决方案1】:

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

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

您需要将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 2020-02-02
    • 1970-01-01
    • 2020-02-01
    • 2010-12-09
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多