1

如何从 Oracle 数据库中的列中解析以逗号分隔的字符串并将每个字符串用作另一个表的连接

例子:

     Table 1                    Table 2

 ID      Name                  ID       Rate
 ---    ------                ----     ------
 1,2,3  FISRT                   1        90
                                2        80      
                                3        70

想从表 1 中提取每个 ID 以加入表 2,例如

extract(tbl1.ID, i) = tbl2.ID

提前致谢。

4

3 回答 3

1

基于这个答案 ,你可以做这样的事情

select *
from table1 t1 join table2 t2 on ','||t1.id||',' like '%,'||t2.id||',%'

这是一个 sqlfiddle

于 2013-09-03T07:13:40.423 回答
0

典型的方法是使用分层查询和 REGEXP_SUBSTR。如果你有一排,那么这没关系;如果你有多个,那么你就有问题了。

下面将解析逗号分隔的字符串。

 select regexp_substr(:txt, '[^,]+', 1, level)
   from dual
connect by regexp_substr(:txt, '[^,]+', 1, level) is not null

但是,如果您一次执行多个操作,则需要添加一个 DISTINCT 请参阅listagg function 中的重复条目

然后,您可以在 JOIN 中使用它。

with the_rows as (
 select distinct regexp_substr(col, '[^,]+', 1, level) as id
   from table1
connect by regexp_substr(col, '[^,]+', 1, level) is not null
        )
 select *
   from table2 a
   join the_rows b
     on a.id = b.id

这是一种可怕的做法;您正在使用分层查询,然后使用 DISTINCT 的唯一排序。它与您所能获得的效率相去甚远。您需要规范化您的表格。

于 2013-09-03T07:02:10.897 回答
0

谢谢大家的想法和评论,也许我真的不需要加入解析的字符串。我发现像“REGEXP_LIKE”这样的东西,下面是我试过的,这和我加入两张桌子一样吗?

SELECT t2.id, t2.rate
  FROM table1 t1, table2 t2
    WHERE (REGEXP_LIKE(t1.id,
                ',' || t2.id || ',|^' || t2.id || ',|,' || t2.id ||
                '$|^' || t2.id || '$'))
于 2013-09-03T08:34:11.230 回答