A表的C1字段值为R10.401;I10.X02;C2O.X30
B表的C2字段
A、B表联合查询,查询条件是A中C1字段值以“;”分隔开的结果跟B表的C2字段值相等sql语句要怎么写
结果查出来应该是三条记录那种
相当于用分别用R10.401;I10.X02;C2O.X30三个值去查询B表
但是不是固定三条的,只是一个列子

解决方案 »

  1.   

     select * from B where exists(
     select 1 from A where instr(';'||c1||';', ';'||c2||';')>0);字段前后加上分号是为了防止C2中的诸如R10 和 401这样的数据也会查出来,也就是做到完全匹配。
      

  2.   

    --1、单行字段拆分为多行
    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)
      

  3.   

    2楼的方法,在第一个和最后一个的情况下,是匹配不成功的..6楼的方法没看明白,大概意思是用这个?SELECT REGEXP_SUBSTR('R10.401;I10.X02;C2O.X30', '[^;]+', 1, LEVEL)
      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一下子就能得到结果吗?
      

  4.   

    eg:
    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;