A表的C1字段值为R10.401;I10.X02;C2O.X30
B表的C2字段
A、B表联合查询,查询条件是A中C1字段值以“;”分隔开的结果跟B表的C2字段值相等sql语句要怎么写
结果查出来应该是三条记录那种
相当于用分别用R10.401;I10.X02;C2O.X30三个值去查询B表
但是不是固定三条的,只是一个列子
B表的C2字段
A、B表联合查询,查询条件是A中C1字段值以“;”分隔开的结果跟B表的C2字段值相等sql语句要怎么写
结果查出来应该是三条记录那种
相当于用分别用R10.401;I10.X02;C2O.X30三个值去查询B表
但是不是固定三条的,只是一个列子
select 1 from A where instr(';'||c1||';', ';'||c2||';')>0);字段前后加上分号是为了防止C2中的诸如R10 和 401这样的数据也会查出来,也就是做到完全匹配。
with t1 as
(
select '张三' c1,'胸外科,皮肤科' c2,date'2000-11-19' c3 from dual
union all
select '李四','胸外科',date'2001-01-04' from dual
union all
select '王五','妇产科,骨科',date'2001-01-08' from dual
)select c1,
substr(','||c2||',',instr(','||c2,',',1,b.rn)+1,
instr(c2||',',',',1,b.rn)-instr(','||c2,',',1,b.rn)) c2,c3
from t1,
(select rownum rn from t1
connect by rownum<10
--connect by rownum < nvl(length(regexp_replace(c2,'[^,]')),0)
) b
where length(c2)-length(replace(c2,','))+1>=b.rn
order by c1,b.rn
--10这个常量也可以改为读取字段中信息:nvl(length(regexp_replace(c2,'[^,]')),0)
FROM DUAL
CONNECT BY LEVEL <=
LENGTH('R10.401;I10.X02;C2O.X30') -
LENGTH(REGEXP_REPLACE('R10.401;I10.X02;C2O.X30', ';', '')) + 1
结果:
REGEXP_SUBSTR('R10.401;I10.X02
R10.401
I10.X02
C2O.X30然后用第二张表去 IN一下子就能得到结果吗?
a表 col_a1 列(数据:第一条记录:aa;bb;cc;dd)
b表 col_b1 列(数据:第一条记录:aa 第二条记录:bb 第三条记录:cc 第四条记录:ee)select * from (
select a.col_a1,b.col_b1,decode(instr(a.col_a1,b.col_b1,1,1),0,null,b.col_b1) col1 from a,b) t
where t.col1 is not null;