【问题标题】:Oracle Query: How to compare two column of different table having comma separated valuesOracle Query:如何比较具有逗号分隔值的不同表的两列
【发布时间】:2020-02-01 07:49:14
【问题描述】:

如何比较不同表中具有逗号分隔值的两个prod_name 列?

这些列具有不同顺序的逗号分隔值。要找到匹配项,所有值应与其他表 prod_name 列值匹配。

换句话说,值可能以不同的顺序存在于列中,只要所有逗号分隔的值都表示在两列中,这并不重要。

TABLE 1:
PRODUCT_ID                         PROD_NAME
================================================
1                                   O,G,E,H,R  
2                                   P,D,H,P,N
3                                   C,D,A,D,P
4                                   E,D,A,D,P


TABLE 2:
PRODUCT_ID  PROD_NAME
======================
5          R,O,G,E H
6          P,D,H,N,P
7          C,D,A,D
8          C,D,A,P,D

预期结果:

1 matches with 5
2 matches with 6
3 matches with 8

【问题讨论】:

  • 到目前为止你有什么尝试?

标签: sql oracle csv plsql split


【解决方案1】:

您可以使用TRANSLATETRIM 函数实现此功能,如下所示。

SQL> with t1 as
  2  (select 1 as product_id, 'O,G,E,H,R' as prod_name from dual union all
  3  select 2, 'P,D,H,P,N' from dual union all
  4  select 3, 'C,D,A,D,P' from dual union all
  5  select 4, 'E,D,A,D,P' from dual),
  6  t2 as
  7  (select 5 as product_id, 'R,O,G,E,H' as prod_name from dual union all
  8  select 6 as product_id, 'P,D,H,N,P' as prod_name from dual union all
  9  select 7 as product_id, 'C,D,A,D' as prod_name from dual union all
 10  select 8 as product_id, 'C,D,A,P,D' as prod_name from dual)
 11  SELECT
 12      T1.PRODUCT_ID,
 13      T2.PRODUCT_ID
 14  FROM
 15      T1
 16      JOIN T2 ON TRIM('#' FROM TRANSLATE(T1.PROD_NAME, T2.PROD_NAME, '#')) IS NULL;

PRODUCT_ID PRODUCT_ID
---------- ----------
         1          5
         2          6
         3          8

SQL>

此查询认为您的 prod_name 在任何值中都没有 # 字符。

干杯!!

【讨论】:

  • 感谢 Tej 弟兄花时间处理这个请求!尽管传递了硬编码的值,但我们可以调整查询以从表中动态运行值吗?
  • 当然,你只需要从第11行开始查询。
  • @Tejash 。 . .如果代码确实是单个字符,这是一个聪明的解决方案。但它并不能很好地概括。
  • 亲爱的 Tej,我没有得到预期的结果。如果第一个表的列有 3 个逗号分隔值,那么第二个表的列也应该具有相同的 3 个逗号分隔值集。两个表中逗号分隔值的 [COUNT + value] 应相同。
  • 在 Real 中,我的列值如下所示:PARACETAMOL,DEXTROMETHORPHAN HBR,GUAIFENESIN,PSEUDOEPHEDRINE HCL
【解决方案2】:

你的数据结构很差。但是,Oracle 有一些强大的正则表达式功能。假设你没有重复,我认为这可行:

select t1.product_id, t2.product_id
from table1 t1 join
     table2 t2
     on regexp_count(t2.prod_name, replace(t1.prod_name, ',', '|')) =
        regexp_count(t1.prod_name, replace(t1.prod_name, ',', '|'));

实际上,这也适用于重复项,但它确实验证了重复项的计数。

Here 是一个 dbfiddle。

【讨论】:

  • 实际上应该是一对一的匹配。 l 表示所有逗号分隔值应与其他列逗号分隔值匹配。此查询不正确。
  • @PramodKumar 。 . .你拉小提琴了吗?它做你想做的事。
  • 不,我还没试过。我是新手。当你说“跑”的时候,你想让我做什么。我想澄清一下,列值是这样的:PARACETAMOL,DEXTROMETHORPHAN HBR,GUAIFENESIN,PSEUDOEPHEDRINE HCL
  • @PramodKumar:“运行小提琴”的意思是:点击 Gorden 回答中的 here 链接
【解决方案3】:

最好不要在单个属性中使用逗号分隔值。数据库规范化的第一条规则是单个属性不能包含多个值,它们必须分解为多个元组,每个元组包含该属性的单个值。

【讨论】:

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