如何从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
提前致谢。
答案 0 :(得分:1)
基于this answer你可以做这样的事情
select *
from table1 t1 join table2 t2 on ','||t1.id||',' like '%,'||t2.id||',%'
答案 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 || '$'))