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

How to replace comma separated text values in a column in Oracle?

我有一个 table 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      |

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                  

更新

What if I have to replace 1 with A, 2 with B, 3 with C and so on?

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