Как заменить разделенные запятыми текстовые значения в столбце в Oracle?

Пример данных

У меня есть стол t1 с Varchar Col V_RELNIST_SKEY который содержит разделенные запятыми числа от 1 до 12, как показано. Я хочу написать оператор выбора, чтобы заменить числа на строку. Например, значение 5,6 должен быть заменен five,six и так далее.

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

1 ответ

Решение

Установка 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                  

Обновить

Что если мне придется заменить 1 на A, 2 на B, 3 на C и так далее?

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
Другие вопросы по тегам