SQL для отдельной части строки - Oracle SQL - PullRequest
1 голос
/ 23 марта 2019

У меня есть таблица table1 со столбцом line, которая имеет тип CLOB

Вот значения:

seq    line
------------------------------
1       ISA*00*TEST
        ISA*00*TEST1
        GS*123GG*TEST*456:EHE
        ST*ERT*RFR*EDRR*EER
        GS*123GG*TEST*456:EHE
-------------------------------
2       ISA*01*TEST
        GS*124GG*TEST*456:EHE
        GS*125GG*TEST*456:EHE
        ST*ERQ*RFR*EDRR*EER
        ST*ERW*RFR*EDRR*EER
        ST*ERR*RFR*EDRR*EER

Я пытаюсь найти отличную строку подстроки перед второй звездой.

Вывод будет:

distinct_line_value   count
ISA*00                2
GS*123GG              2
ST*ERT                1
ISA*01                1
GS*124GG              1
GS*125GG              1
ST*ERQ                1
ST*ERW                1
ST*ERR                1

Какие-нибудь идеи, как я могу сделать это, основываясь на различных для первых 2 звезд?

1 Ответ

3 голосов
/ 23 марта 2019

Вот один из вариантов:

Контрольный пример:

SQL> select * from test;

       SEQ LINE
---------- --------------------------------------------------
         1 ISA*00*TEST
           ISA*00*TEST1
           GS*123GG*TEST*456:EHE
           ST*ERT*RFR*EDRR*EER
           GS*123GG*TEST

         2 ISA*01*TEST
           GS*124GG*TEST*456:EHE
           GS*125GG*TEST*456:EHE
           ST*ERQ*RFR*EDRR*EER
           ST*E

Запрос (см. Комментарии в коде; кроме этого REGEXP_SUBSTR имеет решающее значение здесь, наряду с его 'm' соответствиемпараметр, который обрабатывает входную строку как несколько строк):

SQL> with
  2  -- split CLOB values to rows
  3  inter as
  4    (select seq,
  5       regexp_substr(line, '^.*$', 1, column_value, 'm') res
  6     from test,
  7       table(cast(multiset(select level from dual
  8                           connect by level <= regexp_count(line, chr(10)) + 1
  9                          ) as sys.odcinumberlist))
 10    ),
 11  -- convert CLOB to VARCHAR2 (so that SUBSTR works)
 12  inter2 as
 13    (select to_char(res) res From inter)
 14  -- the final result
 15  select substr(res, 1, instr(res, '*', 1, 2)) val, count(*)
 16  from inter2
 17  group by substr(res, 1, instr(res, '*', 1, 2))
 18  order by 1;

VAL                                                  COUNT(*)
-------------------------------------------------- ----------
GS*123GG*                                                   2
GS*124GG*                                                   1
GS*125GG*                                                   1
ISA*00*                                                     2
ISA*01*                                                     1
ST*ERQ*                                                     1
ST*ERR*                                                     1
ST*ERT*                                                     1
ST*ERW*                                                     1

9 rows selected.

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