如何在Oracle中的列中替换逗号分隔的文本值?

时间:2017-05-03 22:16:22

标签: sql oracle replace oracle12c

Sample Data

我有一个表t1,其中包含varchar col V_RELNIST_SKEY,其中包含1到12之间的逗号分隔数字,如图所示。我想写一个select语句来用字符串替换数字。例如,值5,6应替换为five,six,依此类推。

|V_RELNIST_SKEY|
|6             |
|5,6           |
|1,12          |
|1,2,3,12      |

1 个答案:

答案 0 :(得分:0)

Oracle安装程序

CREATE TABLE test_data ( value ) as
 SELECT '9' FROM DUAL UNION ALL
 SELECT '6' FROM DUAL UNION ALL
 SELECT '1' FROM DUAL UNION ALL
 SELECT '2,3' FROM DUAL UNION ALL
 SELECT '5,6,7' FROM DUAL UNION ALL
 SELECT '8,4' FROM DUAL UNION ALL
 SELECT '1,2,3,4,5,6,7,8,9,10,11,12' FROM DUAL;

<强>查询

SELECT value,
       column_value AS words
FROM   test_data t
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT LISTAGG(
                      TO_CHAR(
                        TO_DATE(
                          REGEXP_SUBSTR( t.value, '\d+', 1, LEVEL ),
                          'J'
                        ),
                        'JSP'
                      ),
                      ','
                    ) WITHIN GROUP ( ORDER BY LEVEL )
             FROM   DUAL
             CONNECT BY LEVEL <= REGEXP_COUNT( t.value, '\d+' )
           ) AS SYS.ODCIVARCHAR2LIST
         )
       ) w;

<强>输出

VALUE                      WORDS                                  
-------------------------- ----------------------------------------
9                          NINE                                    
6                          SIX                                     
1                          ONE                                     
2,3                        TWO,THREE                               
5,6,7                      FIVE,SIX,SEVEN                          
8,4                        EIGHT,FOUR                              
1,2,3,4,5,6,7,8,9,10,11,12 ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,
                           NINE,TEN,ELEVEN,TWELVE                  

<强>更新

  

如果我必须用A替换1,用B替换2,用C替换3等等,该怎么办?

SELECT value,
       COLUMN_VALUE AS words
FROM   test_data t
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT LISTAGG(
                      CHR( 64 + REGEXP_SUBSTR( t.value, '\d+', 1, LEVEL ) ),
                      ','
                    ) WITHIN GROUP ( ORDER BY LEVEL )
             FROM   DUAL
             CONNECT BY LEVEL <= REGEXP_COUNT( t.value, '\d+' )
           ) AS SYS.ODCIVARCHAR2LIST
         )
       ) w;

<强>输出

VALUE                      WORDS                                  
-------------------------- ----------------------------------------
9                          I                                       
6                          F                                       
1                          A                                       
2,3                        B,C                                     
5,6,7                      E,F,G                                   
8,4                        H,D                                     
1,2,3,4,5,6,7,8,9,10,11,12 A,B,C,D,E,F,G,H,I,J,K,L