日期:2014-05-17  浏览次数:20906 次

Oracle 语法问题
A表的C1字段值为R10.401;I10.X02;C2O.X30
B表的C2字段
A、B表联合查询,查询条件是A中C1字段值以“;”分隔开的结果跟B表的C2字段值相等

sql语句要怎么写
结果查出来应该是三条记录那种
相当于用分别用R10.401;I10.X02;C2O.X30三个值去查询B表
但是不是固定三条的,只是一个列子

------解决方案--------------------
SQL code
 select * from B where exists(
 select 1 from A where instr(';'||c1||';', ';'||c2||';')>0);

------解决方案--------------------
--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)
------解决方案--------------------
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一下子就能得到结果吗?
------解决方案--------------------
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;
------解决方案--------------------
你是要把tab_a表的11,22,33,44拆分成 11 22 33 44 ,然后去tab_b表找到11 22 33 44对应的b字段,然后根据查到的b字段拼接成aa,bb,cc,dd?
继续追问: 是的,能用一个SQL语句解决吗? 补充回答: 你QQ多少,问你下具体情况,再帮你写语句吧! 继续追问: 我的QQ:124620534 谢谢! 补充回答: 
已经在你的另一个问题里发给你了,我用的是一个函数来实现的,具体如下:

create or replace function string_test(fetch_str varchar2) return varchar2 is
v_coun NUMBER(10); --临时变量
v_count number(10); --统计字符串中逗号个数+1
v_counter number(10); --临时变量
v_str1 varchar(100); --接收传送进来的字符串
v_sum varchar2(1000); --输出的字符串
v_value varchar2(20); --临时变量
v_temp varchar2(20); --临时变量
v_length NUMBER(11) ; --查看字符串长度
v_sqlstring varchar2(100); --执行的sql语句
begin
v_str1 :=fetch_str;
v_sum:=null;
--字符串为空直接返回
if v_str1 is null then
return(0);
end if;
--获得字符串长度
v_length := length(v_str1) ;
--取出逗号个数+1
FOR v_coun IN 1 .. v_length LOOP
IF instr(v_str1,',',1,v_coun)=0 THEN
v_count:=v_coun;
EXIT;
END IF;
END LOOP;
  
 
--v_count=1代表无逗号,直接返回
if v_count = 1 then
v_sum :=v_str1;
end if;

--取出第一个逗号前的字符串 
v_temp := substr(v_str1,1,instr(v_str1,',',1,1)-1);
v_sqlstring:='select nvl((SELECT value FROM test_20110421 where id='|| v_temp|| '),-1) value from dual';

execute immediate v_sqlstring INTO v_value;
v_sum := v_value||',';


--遍历循环,取出每个逗号后的字符串,最后一个逗号后的字符串不取
for v_counter in 2..v_count-1 loop
v_temp :=substr(v_str1,instr(v_str1,',',1,v_counter-1)+1,instr(v_str1,',',1,v_counter)-instr(v_str1,',',1,v_counter-1)-1);
v_sqlstring:='select nvl((SELECT value FROM test_20110421 where id='|| v_temp|| '),-1) value from dual';
execute immediate v_sqlstring INTO v_value;