欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

一字段存的是多个类别的id的字符串,转化成name字符串

更新时间: 2014-01-05 02:12:31 责任编辑: Author_N1

 

一字段存的是多个类别的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.T_TYPE_ID)))
  from T_INFO a;
上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 02:12:31
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/6972/
本文WWW.DOC100.NET DOC100.NET版权所有。