oracle 两以逗号分割字符串是否包含相同字符串
如题:
例如:str1='1,2,35,3'
str2='2,3' 则为true
总之,将str1以逗号分割,然后将str2以逗号分割,两个字符串只要其中的一个字符是一样的,就返回true,否则返回false。SQL该怎么实现?
[解决办法]
if (str1 like '%'
[解决办法]
str2
[解决办法]
'%') or (str2 like '%'
[解决办法]
str1
[解决办法]
'%') then
--true
else
--false
end if;
[解决办法]
先建一个分割函数,后续你自己处理
create or replace type type_split as table of varchar2(100); --创建一个 type ,如果为了使split函数具有通用性,请将其size 设大些。
--创建function
create or replace function split
(
p_list varchar2,
p_sep varchar2 := ','
) return type_split pipelined
is
l_idx pls_integer;
v_list varchar2(50) := 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;
[解决办法]
WITH TEST AS (
SELECT '1,2,35,3' AS STR1,'2,3' AS STR2 FROM DUAL
UNION ALL
SELECT '1,2,35,3' AS STR1,'4,6,8' AS STR2 FROM DUAL
)
SELECT STR1, STR2, DECODE(FLG, 0, 'TRUE', 'FALSE') AS RESULT
FROM (SELECT INSTR(TRANSLATE(REPLACE(STR1, ','),
REPLACE(STR2, ','),
'XXXXXXXXXX'),
'X') AS FLG,
STR1,
STR2
FROM TEST)
--------------------------------------------
11,2,35,32,3FALSE
21,2,35,34,6,8TRUE
31,2,35,3,84,6,8FALSE
------解决方案--------------------
select decode(count(*),0,'false','true') i_f from (
select regexp_substr('2,3','\d+',1,level) s1
from dual connect by level <= (select length(regexp_replace('2,3','\d+'))+1 from dual)
intersect
select regexp_substr('1,2,35,3','\d+',1,level) s1
from dual connect by level <= (select length(regexp_replace('1,2,35,3','\d+'))+1 from dual)
)
