当前位置:首页 > 数据库 > Oracle技术

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

优良自学吧提供Oracle 一串字符依据分隔符转转成中文,Oracle 一串字符根据分隔符转转成中文表TABLEA  CREATE TABLE TABLEA ( OID  INT, ZONE_CODE  VARCHAR2(30) ) T

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

(本文来自互联网,不代表搜站(http://www.ylzx8.cn/)的观点和立场)
本站所有内容来自互联网,若本站收录的信息无意侵犯了贵司版权,请给我们来信(ylzx8cn@163.com),我们会及时处理和回复,谢谢