我有两个表,表示table1和table2,下面有详细信息
create table test1(id number, name varchar2(20));
insert into test1 values(11,'micro');
insert into test1 values(22,'soft');
create table test2(id number, name varchar2(20));
insert into test2 values(77,'micro,soft');
1)如果我使用下面的查询,我没有选择行
select * from test1 t1 where t1.name in ( select ''''||replace(t2.name,',',''',''')||'''' from test2;
2)如果我单独触发子查询输出,我得到的是:'micro','soft'
select ''''||replace(t2.name,',',''',''')||'''' from test2;
但如果我触发查询(1)我需要结果
id name
------------
11 micro
22 soft
有人可以帮我用查询(1)得到相同的结果。
答案 0 :(得分:3)
你有一个非常奇怪的数据布局,应该可以改变它。
您可以使用join
或使用like
的相关子查询执行您想要的操作:
select *
from test1 t1
where exists (select 1
from test2 t2
where ','||t2.name||',' like '%,'||t1.name||',%'
);
你的版本不起作用,因为表达式:
where x in ('a,b,c')
测试x
等于字符串值'a,b,c'
的位置,而不是它是否等于三个值中的一个。
答案 1 :(得分:1)
使用REGEXP_SUBSTR功能完成此操作。
SELECT *
FROM test1 t1
WHERE t1.NAME IN(SELECT regexp_substr(t2.NAME, '[^,]+', 1, ROWNUM)
FROM test2 t2
CONNECT BY LEVEL <= LENGTH (regexp_replace (t2.NAME, '[^,]+')) + 1
);