由于不会写Oracle,初学。
特请教一个问题。类似一下代码的求并集,要在一个过程或函数中如何实现。
其中QJID =XX 是传入的参数,使用逗号分隔 例如 1,2这样。SELECT KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R A
WHERE (QJID = 1)
intersect
SELECT KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R B
WHERE (QJID = 2)当然实现就可以,用IN也行,可我不懂Oracle语法,写不出这样要求的过程
特求大侠指点
特请教一个问题。类似一下代码的求并集,要在一个过程或函数中如何实现。
其中QJID =XX 是传入的参数,使用逗号分隔 例如 1,2这样。SELECT KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R A
WHERE (QJID = 1)
intersect
SELECT KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R B
WHERE (QJID = 2)当然实现就可以,用IN也行,可我不懂Oracle语法,写不出这样要求的过程
特求大侠指点
FROM JXKH_T_TZZBXX_R A
WHERE QJID in (1,2) ;
FROM JXKH_T_TZZBXX_R A
WHERE QJID in (1,2) ;
先造一个 转换 ,号隔开的字符为一个表 的函数。create or replace function split
(
p_list varchar2,
p_sep varchar2 := ','
) return type_split pipelined
is
l_idx pls_integer;
v_list varchar2(32767) := p_list;
begin
loop
l_idx := instr(v_list,p_sep);
if l_idx > 0 then
pipe row(substr(v_list,1,l_idx-1));
v_list := substr(v_list,l_idx+length(p_sep));
else
pipe row(v_list);
exit;
end if;
end loop;
return;
end split;
/
然后就能用下面的 sql.
:QJID 内容可以为 ,号隔开的 数字。
SELECT /*+ use_nl(QJIDs A)*/ KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R A
inner join table(split(:QJID,',')) QJIDs on QJIDs.column_value=A.QJID
FROM JXKH_T_TZZBXX_R A
WHERE QJID =1 and QJID =2 ; 这个是交集吧。
FROM JXKH_T_TZZBXX_R B
WHERE (QJID = 2 or QJID = 1)
group by KHBH, ZBBH,khbh having(count(QJID)>1)这个一定是交集
:QJID 内容可以为 ,号隔开的 数字SELECT /*+ use_nl(QJIDs A)*/ KHBH, ZBBH,khbh
FROM JXKH_T_TZZBXX_R A
inner join table(split(:QJID,',')) QJIDs on QJIDs.column_value=A.QJID
group by KHBH, ZBBH,khbh having(count(QJID)>1)
就能实现存过程 传一个 ,号隔开的数字 做参数。
就是那个逗号分隔的函数 ,怎么好像有问题啊,我也看不懂