Назначить строку на основе последовательности в строке - Oracle SQL - PullRequest
0 голосов
/ 14 марта 2019

У меня есть текст в одной ячейке таблицы в Oracle SQL:

ISA*00*AUTHORIZAT*00*SECURITY I*ZZ*000000060000000*ZZ*000000010000000*110705*1132*^*00501*110705001*0*T*:~
GS*HC*00000006*00000001*20110705*113253*110705001*X*005010X222A1~
ST*837*0021*005010X222~
BHT*0019*00*244579*20061015*1023*CH~
NM1*41*2*PREMIER BILLING SERVICE*****46*TGJ23~
PER*IC*JERRY*TE*3055552222*EX*231~
NM1*40*2*KEY INSURANCE COMPANY*****46*66783JJT~
HL*1**20*1~
PRV*BI*PXC*203BF0100Y~
NM1*85*2*BEN KILDARE SERVICE*****XX*9876543210~
N3*234 SEAWAY ST~
N4*MIAMI*FL*33111~

Обратите внимание, что выше в 1 ячейке Мне нужно разбить его на несколько строк и назначить цикл для него.

Таблица будет выглядеть так:

loop        message
000         ISA*00*AUTHORIZAT*00*SECURITY I*ZZ*000000060000000*ZZ*000000010000000*110705*1132*^*00501*110705001*0*T*:~
000         GS*HC*00000006*00000001*20110705*113253*110705001*X*005010X222A1~
000         ST*837*0021*005010X222~
000         BHT*0019*00*244579*20061015*1023*CH~
1000A       NM1*41*2*PREMIER BILLING SERVICE*****46*TGJ23~
1000A       PER*IC*JERRY*TE*3055552222*EX*231~
1000B       NM1*40*2*KEY INSURANCE COMPANY*****46*66783JJT~
2000A       HL*1**20*1~
2010AA      PRV*BI*PXC*203BF0100Y~
2010AA      NM1*85*2*BEN KILDARE SERVICE*****XX*9876543210~
2010AA      N3*234 SEAWAY ST~
2010AA      N4*MIAMI*FL*33111~

Итак, в основном мне нужно разбить строку на основе новой строки, а затем назначить соответствующий цикл на основе последовательности. Правила таковы:

  • Первый NM1 должен быть 1000А и продолжать присваивать до следующего NM1
  • Следующий NM1 должен быть 1000B и продолжать присваивать до следующего PRV
  • Следующим PRV должен быть 2010AA и продолжать назначать до следующего NM1

Мне удалось успешно разбить текст на несколько строк с помощью регулярных выражений, но я не могу назначать значения в зависимости от условий.

Есть ли способ закодировать его в Oracle SQL?

1 Ответ

1 голос
/ 14 марта 2019

Установка Oracle :

CREATE TABLE test_data ( value ) AS
SELECT 'ISA*00*AUTHORIZAT*00*SECURITY I*ZZ*000000060000000*ZZ*000000010000000*110705*1132*^*00501*110705001*0*T*:~
GS*HC*00000006*00000001*20110705*113253*110705001*X*005010X222A1~
ST*837*0021*005010X222~
BHT*0019*00*244579*20061015*1023*CH~
NM1*41*2*PREMIER BILLING SERVICE*****46*TGJ23~
PER*IC*JERRY*TE*3055552222*EX*231~
NM1*40*2*KEY INSURANCE COMPANY*****46*66783JJT~
HL*1**20*1~
PRV*BI*PXC*203BF0100Y~
NM1*85*2*BEN KILDARE SERVICE*****XX*9876543210~
N3*234 SEAWAY ST~
N4*MIAMI*FL*33111~'
FROM   DUAL;

Запрос

WITH rsqfc ( value, line, rn, max_rn, nm1, prv, depth ) AS (
  SELECT value,
         REGEXP_SUBSTR( value, '.+?(' || CHR(10) || '|$)', 1, 1 ),
         1,
         REGEXP_COUNT( value, '.+?(' || CHR(10) || '|$)' ) - 1,
         CASE SUBSTR( value, 1, 4 ) WHEN 'NM1*' THEN 1 ELSE 0 END,
         CASE SUBSTR( value, 1, 4 ) WHEN 'PRV*' THEN 1 ELSE 0 END,
         CASE SUBSTR( value, 1, 4 ) WHEN 'NM1*' THEN 1 WHEN 'PRV*' THEN 2 ELSE 0 END
  FROM   test_data
  UNION ALL
  SELECT value,
         REGEXP_SUBSTR( value, '.+?(' || CHR(10) || '|$)', 1, rn + 1 ),
         rn + 1,
         max_rn,
         CASE SUBSTR( REGEXP_SUBSTR( value, '.+?(' || CHR(10) || '|$)', 1, rn + 1 ), 1, 4 ) WHEN 'NM1*' THEN nm1 + 1 ELSE nm1 END,
         CASE SUBSTR( REGEXP_SUBSTR( value, '.+?(' || CHR(10) || '|$)', 1, rn + 1 ), 1, 4 ) WHEN 'PRV*' THEN prv + 1 ELSE prv END,
         CASE SUBSTR( REGEXP_SUBSTR( value, '.+?(' || CHR(10) || '|$)', 1, rn + 1 ), 1, 4 ) WHEN 'NM1*' THEN 1 WHEN 'PRV*' THEN 2 ELSE depth END
  FROM   rsqfc
  WHERE  rn < max_rn
)
SELECT CASE depth
       WHEN 2 THEN '2010A' || CHR( 64 + prv )
       WHEN 1 THEN '1000' || CHR( 64 + nm1 )
       WHEN 0 THEN '000'
       END AS "LOOP",
       line
FROM   rsqfc;

Выход

LOOP   | LINE                                                                                                          
:----- | :-------------------------------------------------------------------------------------------------------------
000    | ISA*00*AUTHORIZAT*00*SECURITY I*ZZ*000000060000000*ZZ*000000010000000*110705*1132*^*00501*110705001*0*T*:~<br>
000    | GS*HC*00000006*00000001*20110705*113253*110705001*X*005010X222A1~<br>                                         
000    | ST*837*0021*005010X222~<br>                                                                                   
000    | BHT*0019*00*244579*20061015*1023*CH~<br>                                                                      
1000A  | NM1*41*2*PREMIER BILLING SERVICE*****46*TGJ23~<br>                                                            
1000A  | PER*IC*JERRY*TE*3055552222*EX*231~<br>                                                                        
1000B  | NM1*40*2*KEY INSURANCE COMPANY*****46*66783JJT~<br>                                                           
1000B  | HL*1**20*1~<br>                                                                                               
2010AA | PRV*BI*PXC*203BF0100Y~<br>                                                                                    
1000C  | NM1*85*2*BEN KILDARE SERVICE*****XX*9876543210~<br>                                                           
1000C  | N3*234 SEAWAY ST~<br>                                                                                         

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

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