SQL:解析逗号分隔的字符串并用作连接

时间:2013-09-03 06:57:28

标签: sql oracle

如何从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

提前致谢。

3 个答案:

答案 0 :(得分:1)

基于this answer你可以做这样的事情

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

here is a sqlfiddle

答案 1 :(得分:0)

典型的方法是使用分层查询和REGEXP_SUBSTR。如果你有一排,那么这是可以的;如果你有多个,那么你就会遇到问题。

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

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

但是,如果您同时执行多项操作,则需要添加DISTINCT,请参阅duplicating entries in 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唯一的排序。它远远没有你能得到的效率。你需要规范你的桌子。

答案 2 :(得分:0)

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

SELECT t2.id, t2.rate
  FROM table1 t1, table2 t2
    WHERE (REGEXP_LIKE(t1.id,
                ',' || t2.id || ',|^' || t2.id || ',|,' || t2.id ||
                '$|^' || t2.id || '$'))