REGEXP_REPLACE Ошибка при подстановке строки - PullRequest
0 голосов
/ 08 мая 2019

Я хочу преобразовать следующую строку в необходимый формат. У меня будет несколько значений, как показано ниже. Есть ли простой способ сделать это. Я попытался использовать REGEXP_REPLACE и не смог заставить его работать:

Данные столбца

Region[Coding Analyst|||BA|||reg pro|||04561|||08/16/2011|||Board member|||AZ|||06340|||Whiter Bridge|||CA|||M0673|||West Region 09|||K04956|||East Division|||Supreme]

необходимые данные

{actingname=06340, actingid=M0673, insturmentid=BA, insturmentname=Coding Analyst, commonname=West Region 09, stdate=08/16/2011, linnumber=04561, linstate=CA, linname=Supreme}

Проблема в том, чтобы получить 10,11,12 и 15 позицию строки. Я могу получить что-нибудь ниже 10-й позиции, но не 10 или более строк. Подскажите, пожалуйста, что мне здесь не хватает

 SELECT REGEXP_REPLACE(Region[Coding Analyst|||BA|||reg pro|||04561|||08/16/2011|||Board member|||AZ|||06340|||Whiter Bridge|||CA|||M0673|||West Region 09|||K04956|||East Division|||Supreme],'^Region\[([[:alpha:][:space:][:digit:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[:alpha:][:space:][:punct:]]*)\|\|\|([[:digit:][:alpha:]]*)\|\|\|([[:digit:][:punct:]]*)\|\|\|([[:alpha:][:space:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[:digit:]]*)\|\|\|([[:alpha:][:space:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[:digit:][:alpha:]]*)\|\|\|([[:digit:][:alpha:][:space:]]*)\|\|\|([[:digit:][:alpha:]]*)\|\|\|([[:alpha:][:space:]]*)\|\|\|([[:alpha:]]*).*','{actingname=\8,actingid=\11,insturmentid=\2,insturmentname=\1,commonname=\12, stdate=\5,linnumber=4,linstate=10,linname=15}']') as replaced
    FROM dual;--Here 10,11,12 and 15 position are not being fetched

Исправлен запрос в соответствии с обратной связью @ MT0, поскольку у меня есть несколько строк с нулевым значением и текстом 'нулевым' в качестве значений. Я получаю ошибку ORA-00932: несоответствующие типы данных: ожидаемый CHAR получил CLOB

 SELECT
            '{'
       ||   'actingname='     || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  8, NULL, 1 )
       || ', actingid='       || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 11, NULL, 1 )
       || ', insturmentid='   || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  2, NULL, 1 )
       || ', insturmentname=' || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  1, NULL, 1 )
       || ', commonname='     || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 12, NULL, 1 )
       || ', stdate='         || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  5, NULL, 1 )
       || ', linnumber='      || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  4, NULL, 1 )
       || ', linstate='       || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 10, NULL, 1 )
       || ', linname='        || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 15, NULL, 1 )
       || '}'
       AS replaced
    FROM test_data
where value is not null and value <>'null'

1 Ответ

1 голос
/ 08 мая 2019

Использование REGEXP_SUBSTR:

Установка Oracle :

CREATE TABLE test_data( value ) AS
  SELECT 'Region[Coding Analyst|||BA|||reg pro|||04561|||08/16/2011|||Board member|||AZ|||06340|||Whiter Bridge|||CA|||M0673|||West Region 09|||K04956|||East Division|||Supreme],'
  FROM dual;

Запрос

SELECT    '{'
       ||   'actingname='     || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  8, NULL, 1 )
       || ', actingid='       || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 11, NULL, 1 )
       || ', insturmentid='   || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  2, NULL, 1 )
       || ', insturmentname=' || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  1, NULL, 1 )
       || ', commonname='     || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 12, NULL, 1 )
       || ', stdate='         || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  5, NULL, 1 )
       || ', linnumber='      || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1,  4, NULL, 1 )
       || ', linstate='       || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 10, NULL, 1 )
       || ', linname='        || REGEXP_SUBSTR( value, '([a-zA-Z0-9 ]*)(\|\|\||\])', 1, 15, NULL, 1 )
       || '}' AS replaced
FROM   test_data

выход

| REPLACED                                                                                                                                                                  |
| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| {actingname=06340, actingid=M0673, insturmentid=BA, insturmentname=Coding Analyst, commonname=West Region 09, stdate=2011, linnumber=04561, linstate=CA, linname=Supreme} |

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...