Oracle String Conversion - PullRequest
       3

Oracle String Conversion

1 голос
/ 25 апреля 2019

Нужна помощь в преобразовании следующей строки в необходимый формат.У меня будет несколько значений, как показано ниже.Есть ли простой способ сделать это, используя REGEXP или что-то лучше?

Текущий формат из столбца A

Region[Envionment Lead|||OTC|||06340|||List Program|||TX|||Z3452|||Souther Region 05|||M7894|||California Divison|||Beginning]

Region[Coding Analyst|||BA|||04561|||Water Bridge|||CA|||M8459|||West Region 09|||K04956|||East Division|||Supreme]

Обязательный формат столбца A

Region[actingname=Envionment Lead,commonid=OTC,insturmentid=06340,commonname=List Program]

Region[actingname=Coding Analyst,commonid=BA,insturmentid=04561,commonname=Water Bridge]

пересмотренные данные

**Column data**  
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]

**required Data** 
{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 или более строк.Можете ли вы указать мне, что мне здесь не хватает

'{actingname=\8,actingid=\11,insturmentid=\2,insturmentname=\1,commonname=\12, stdate=\5,linnumber=4,linstate=10,linname=15}'--Here 10,11,12 and 15 posistion are not being fethched

Ответы [ 3 ]

2 голосов
/ 25 апреля 2019

Я использовал REGEXP_REPLACE

SELECT REGEXP_REPLACE(
    'Region[Envionment Lead|||OTC|||06340|||List Program|||TX|||Z3452|||Souther Region 05|||M7894|||California Divison|||Beginning]',
    '^Region\[([[:alpha:][:space:][:digit:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[:digit:]]*)\|\|\|([[:alpha:][:space:][:digit:]]*).*',
    'Region[actingname=\1,commonid=\2,instrumentid=\3,commonname=\4]') as replaced
FROM dual

или как обновление это будет

UPDATE table1 
SET col1 = REGEXP_REPLACE(
             col1,
             '^Region\[([[:alpha:][:space:][:digit:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[:digit:]]*)\|\|\|([[:alpha:][:space:][:digit:]]*).*',
             'Region[actingname=\1,commonid=\2,instrumentid=\3,commonname=\4]')
0 голосов
/ 25 апреля 2019

это будет работать:

select substr(regexp_replace(regexp_replace(regexp_replace
(regexp_replace(regexp_replace("col1",'\[','[actingname='),
                     '\|\|\|',',commonid=',1,1,'i'),
'\|\|\|',',insturmentid=',1,1,'i'),
'\|\|\|',',commonname=',1,1,'i'),
    '\|',']',1,1,'i'),
             1,regexp_instr(regexp_replace(regexp_replace(regexp_replace
(regexp_replace(regexp_replace("col1",'\[','[actingname='),
                     '\|\|\|',',commonid=',1,1,'i'),
'\|\|\|',',insturmentid=',1,1,'i'),
'\|\|\|',',commonname=',1,1,'i'),
    '\|',']',1,1,'i'),'\]')-1            )||']'
from Table1;

проверка: http://sqlfiddle.com/#!4/3ddfa0/11

спасибо !!!!!!

0 голосов
/ 25 апреля 2019

Вы можете использовать regexp_substr и listagg последовательно

with t1(str1) as
(
 select 'Region[Coding Analyst|||BA|||04561|||Water Bridge]' from dual   
),   t2(str2) as
(
 select 'actingname,commonid,insturmentid,commonname' from dual   
),   t3 as
(
select regexp_substr(str1, '[^|||]+', 1, level) str1,
       regexp_substr(str2, '[^,]+', 1, level)||'=' str2,
       level as lvl
  from t1
  cross join t2 
connect by level <= regexp_count(str1, '[^|||]+')
),   t4 as
(
select case when lvl = 1 then 
                 replace(str1,'[','['||str2)
       else
                 str2||str1
       end as str, lvl
  from t3
)    
select listagg(str,',') within group (order by lvl) as "Result String" from t4;

Result String
----------------------------------------------------------------------------------------
Region[actingname=Coding Analyst,commonid=BA,insturmentid=04561,commonname=Water Bridge]

P.S. Я рассмотрел вторую как образец и взял 4 первые строки из-за количества подстрок, разделенных тройными трубами, из-за того, что число меток кортежей, заканчивающихся знаком равенства, равно 4. Демо

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