日期:2014-05-17 浏览次数:21136 次
CREATE TABLE T_TYPE
(
T_TYPE_ID NUMBER,
T_TYPE_NAME VARCHAR2(20)
);
INSERT INTO T_TYPE
SELECT 1, '苹果' FROM DUAL UNION ALL
SELECT 2, '香蕉' FROM DUAL;
CREATE TABLE T_INFO
(
T_PERSON_ID NUMBER,
T_PERSON_NAME VARCHAR(20),
T_TYPE_ID VARCHAR(200)
);
INSERT INTO T_INFO
SELECT 1, '张三', '1,2' FROM DUAL UNION ALL
SELECT 1, '张三', '2' FROM DUAL UNION ALL
SELECT 2, '李四', '1' FROM DUAL
/*
结果--
把ID 转换成Name
1 1 张三 苹果,香蕉
2 1 张三 香蕉
3 2 李四 苹果
*/
declare
v_str varchar2(20) := '1,2,3,4';
v1 varchar2(20);
v2 varchar2(20);
begin
v2 := v_str;
while v2 is not null loop
if instr(v2, ',') > 0 then --中间有分隔符,拆分前后两段,否则全赋给第一段
v1 := substr(v2, 1, instr(v2, ',') - 1);
v2 := substr(v2, instr(v2, ',') + 1);
else
v1 := v2;
v2 := null;
end if;
dbms_output.put_line(v1
------解决方案--------------------
' '
------解决方案--------------------
v2);
end loop;
end;
select T_PERSON_ID,
T_PERSON_NAME,
(select LISTAGG(T_TYPE_NAME, ', ') WITHIN GROUP (ORDER BY T_TYPE_ID)
from T_TYPE
where T_TYPE_ID in
(SELECT regexp_substr(a.T_TYPE_ID, '[^,]+', 1, LEVEL)
FROM dual
CONNECT BY LEVEL < length(a