a表数据格式:
AID INDUSTRY
200001 1
200007 1
100007 2
100001 3b表数据格式:
msisdn Menu_List
1 100001|200001
2 100001|100007
3 100007|200007
4 100007
5 200007b表的Menu_List由a表的AID组成,我想找出b表的Menu_List中包含a表industry='1'的AID的记录,语句如下:
Select distinct msisdn,Menu_List
FROM a,
(Select aid From b Where industry='1' ) b
where a.menu_list is not null and INSTR(a.Menu_List,b.AID) > 0
AID INDUSTRY
200001 1
200007 1
100007 2
100001 3b表数据格式:
msisdn Menu_List
1 100001|200001
2 100001|100007
3 100007|200007
4 100007
5 200007b表的Menu_List由a表的AID组成,我想找出b表的Menu_List中包含a表industry='1'的AID的记录,语句如下:
Select distinct msisdn,Menu_List
FROM a,
(Select aid From b Where industry='1' ) b
where a.menu_list is not null and INSTR(a.Menu_List,b.AID) > 0
FROM a,
(Select aid From b Where industry='1' ) b
where a.menu_list is not null and INSTR(a.Menu_List,b.AID) > 0写法是没错的,但是可能有问题.instr前后都加 , 确保不会匹配到其他的。
例如menu_list 100001 ;AID 10 。 你的写法就有问题了
Select distinct msisdn,Menu_List
FROM a,
(Select aid From b Where industry='1' ) b
where a.menu_list is not null and INSTR(','||a.Menu_List||',',','||b.AID||',') > 0
要看它Menu_List本身的格式.
开始的地方,未必有空格,或者逗号.从他写的数据来看,他自己的做法是没有问题的.
或者直接用like
Select distinct msisdn,Menu_List
FROM a,
(Select aid From b Where industry='1' ) b
where a.menu_list is not null and '¦'||a.Menu_List||'¦' like '%¦'||nvl(b.AID,'')||'¦%';
会产生问题的情况是你的aid之间包含
比如aid 1000,100,10 有这3个值。你的sql找10的时候就会找到1000和100,我的sql不会。
如果你的aid位数是固定的话,是不会有问题的。
但是你为什么不把程序写健壮点了?
在请教个问题,然后结贴:
如果要把b表的数据按menu_list分解,每个menu_list只有一个AID,应该怎么写语句呢?比如:
msisdn Menu_List
1 100001 ¦200001
分解为2条记录,
msisdn Menu_List
1 100001
1 200001
谢谢!
str varchar2(100);
startposition number(10);
len number(10);
output varchar2(100);
begin
str:= 'hello,nick,xingxing ';
startposition:=1;
loop
select instr(str, ', ',startposition ) into len from dual;
dbms_output.put_line(startposition);
dbms_output.put_line(len);
if len!=0 then
select substr(str,startposition,len-startposition) into output from dual;
else
select substr(str,startposition) into output from dual;
dbms_output.put_line(output);
exit;
end if;
dbms_output.put_line(output);
startposition:=len+1;
dbms_output.put_line( '------------------------------------- ');
end loop;
end;
DragonBill的回复。
如果你的aid长度是6不变的话可以实现。SELECT DISTINCT msisdn ,
SUBSTR(Menu_List, INSTR('|' || Menu_List, '|', 1, LEVEL), 2) AS Menu_List
FROM A
CONNECT BY LEVEL <= (LENGTH(Menu_List) - LENGTH(REPLACE(Menu_List, '|','')))+1
ORDER BY msisdn;