当前位置: 代码迷 >> Oracle技术 >> Oracle 一串字符依据分隔符转转成中文
  详细解决方案

Oracle 一串字符依据分隔符转转成中文

热度:387   发布时间:2016-04-24 08:05:30.0
Oracle 一串字符根据分隔符转转成中文
表TABLEA
 CREATE TABLE TABLEA
(
OID  INT,
ZONE_CODE  VARCHAR2(30)
)

TABLEA的数据
 insert into TABLEA(OID,ZONE_CODE) VALUES (1,'04,01,02');
 insert into TABLEA(OID,ZONE_CODE) VALUES (2,'04,03,02');
 insert into TABLEA(OID,ZONE_CODE) VALUES (3,'04');

表TABLEB

 CREATE TABLE TABLEB
(
OID  INT,
ZONE_CODE  VARCHAR2(2),
ZONE_NAME  VARCHAR2(30)
)

TABLEB数据
 insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (5,'04','1号货站');

 insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (1,'01','中区');

 insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (2,'02','北区');

 insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (3,'03','南区');

 insert into TABLEB(OID,ZONE_CODE,ZONE_NAME) VALUES (6,'08','东北区');


想要的结果是:
查询TABLEA表得到如下数据:

OID  ZONE_CODE
1        04-1号货站,01-中区,02-北区
2        04-1号货站,03-南区,02-北区
3         04-1号货站

这种结果的Oracle 要怎么实现?
------解决思路----------------------
引用:
注:TABLEA表ZONE_CODE 字段分隔后可以在TABLEB表找到中文。


--data '01,02,01,03,02'  '03,02'
--result 01-aa,02-bb,01-aa,03-cc,02-bb   03-cc,02-bb
with tb1 as
 (select 1 id, '01,02,01,03,02' cd
    from dual
  union all
  select 2, '03,02'
    from dual),
tb2 as
 (select '01' cd, 'aa' nm
    from dual
  union all
  select '02' cd, 'bb' nm
    from dual
  union all
  select '03' cd, 'cc' nm
    from dual)

SELECT T3.ID,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(t3.cd 
------解决思路----------------------
 '-' 
------解决思路----------------------
 T3.NM, ',')), ',')
  from (select tb2.cd,
               tb2.nm,
               t1.id,
               rnum,
               ROW_NUMBER() OVER(PARTITION BY T1.RNUM ORDER BY lv) RN
          from (SELECT t.*,
                       REGEXP_SUBSTR(T.cd, '[^,]+', 1, LEVEL) STR,
                       level lv
                  FROM (SELECT t.*, ROWNUM RNUM FROM TB1 T) T
                CONNECT BY LEVEL <= regexp_count(t.cd, ',') + 1
                       AND PRIOR RNUM = RNUM
                       AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL) t1,
               tb2
         where t1.str = tb2.cd) t3
 START WITH T3.RN = 1
CONNECT BY PRIOR rn = rn - 1
       AND PRIOR T3.RNUM = T3.RNUM
 GROUP BY T3.RNUM, T3.ID;

------解决思路----------------------
SELECT OID,(
SELECT wm_concat(b.zone_code
------解决思路----------------------
'-'
------解决思路----------------------
b.zone_name) FROM tableb b WHERE ','
------解决思路----------------------
a.zone_code
------解决思路----------------------
',' LIKE '%,'
------解决思路----------------------
b.zone_code
------解决思路----------------------
',%'
)zone_name
FROM tablea a;
------解决思路----------------------
11g可以考虑使用listagg
  相关解决方案