日期:2014-05-17  浏览次数:21068 次

一字段存的是多个类别的ID的字符串,转化成Name字符串,在线等
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 李四 苹果
*/

------解决方案--------------------
这个以前写过,但手里没现成的例子

思路就是将 '1,2' 字符串用 instr和substr函数进行循环拆分,然后取回名字再拼接


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