一字段存的是多个类别的ID的字符串,转化成Name字符串,在线等

KLL 2013-11-04 04:11:38
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 李四 苹果
*/
...全文
243 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
KLL 2013-11-04
  • 打赏
  • 举报
回复
还有没有更方便点的,我这个表里不知这一个id串
KLL 2013-11-04
  • 打赏
  • 举报
回复
引用 2 楼 NIan_jun 的回复:
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;
这个不错
KLL 2013-11-04
  • 打赏
  • 举报
回复
这也太复杂了吧
NIan_jun 2013-11-04
  • 打赏
  • 举报
回复
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;
xinpingf 2013-11-04
  • 打赏
  • 举报
回复
这个以前写过,但手里没现成的例子 思路就是将 '1,2' 字符串用 instr和substr函数进行循环拆分,然后取回名字再拼接 [CODE=SQL] 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; [/CODE]

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧