Сплит специальный символ в 2 столбца и объединить в несколько строк в оракуле - PullRequest
0 голосов
/ 07 февраля 2019

Приятно познакомиться.У меня есть таблица с именем A. Таблица содержит два столбца с именами col1 и col2.Col1 с данными типа TN ^ AN ^ KA ^, а col2 содержит 123 ^ 456 ^ 987.

Необходимо удалить символ ^ и объединить два значения столбца в несколько строк, как показано ниже.

DDL:

Create table a (col1 varchar2(20), col2 varchar2(20));

DML:

insert into values ('TN^AN^KA','123^456^987');
commit;

select * from a;
----------     --------------
col1          col2 
---------     ---------------
TN^AN^KA       123^456^987

Нужен вывод, как этот

TN123

AN456

KA987

Ответы [ 5 ]

0 голосов
/ 12 февраля 2019

Используйте regexp_substr для получения желаемого результата.

select REGEXP_SUBSTR(col1,'[^\^]+',1,level)||REGEXP_SUBSTR(col2,'[^\^]+',1,level) as res from A_TEST
connect by REGEXP_SUBSTR(col1,'[^\^]+',1,level) is not null;
0 голосов
/ 07 февраля 2019

Вы можете использовать regexp_substr, regexp_count и concat вместе:

  with a(col1, col2) as
  (
    select 'TN^AN^KA','123^456^987' from dual
  )
    select concat(
                  regexp_substr(col1, '[^\^]+', 1, level),
                  regexp_substr(col2, '[^\^]+', 1, level) 
                 ) as "Result String"  
      from a
    connect by level <= regexp_count(col1, '\^') + 1;

 Result String
 -------------
 TN123
 AN456
 KA987

Демо

0 голосов
/ 07 февраля 2019

Вот решение, которое допускает любое количество частей в каждой входной строке (не обязательно одинаковое в двух столбцах и переменное от одной строки к другой).Два последовательных символа каретки обозначают NULL для этого токена.Я добавил идентификатор (чтобы вы знали, откуда берется каждая выходная строка), и добавил столбец ORD, чтобы показать первый токен против второго против третьего и т. Д.

В запросе я использую предложение LATERAL(доступно начиная с Oracle 12.1), что позволяет нам обрабатывать каждую входную строку изолированно, отдельно от других строк - это делает запрос быстрее и проще.В регулярных выражениях обратите внимание, что символ вставки должен быть экранирован (в противном случае это означает «начало строки»), за исключением в наборах символов (здесь: наборы запрещенных символов), где метасимволы теряют свое особое значение.

НОВАЯ НАСТРОЙКА

drop table a purge;
Create table a (id number, col1 varchar2(20), col2 varchar2(20));
insert into a values (101, 'TN^AN^KA','123^456^987');
insert into a values (102, 'AB^CE^YZZ', '234^000');
insert into a values (103, 'AB', '0230');
commit;

ЗАПРОС И ВЫХОД

select a.id, l.ord, l.token
from   a,
       lateral (select  level as ord,
                        regexp_substr(col1, '([^^]*)(\^|$)', 1, level, null, 1) ||
                        regexp_substr(col2, '([^^]*)(\^|$)', 1, level, null, 1)
                        as token
                from    dual
                connect by level <= 1 + greatest(regexp_count(col1, '\^'),
                                                 regexp_count(col2, '\^'))
               ) l
order by id, ord;

   ID ORD TOKEN   
----- --- --------
  101   1 TN123   
  101   2 AN456   
  101   3 KA987   
  102   1 AB234   
  102   2 CE000   
  102   3 YZZ     
  103   1 AB0230 
0 голосов
/ 07 февраля 2019

Как насчет REGEXP_SUBSTR?Я немного изменил входные данные, чтобы возвращаемые значения не были установлены одинаково.Что оно делает?Принимает слова между ^ символами.Если разделитель изменится, этот код может (или не может) работать.

SQL> with test (col1, col2) as
  2    (select 'TN^AN^KA', '123^45^6789' from dual)
  3  select regexp_substr(col1, '\w+', 1, 1) || regexp_substr(col2, '\w+', 1, 1) res1,
  4         regexp_substr(col1, '\w+', 1, 2) || regexp_substr(col2, '\w+', 1, 2) res2,
  5         regexp_substr(col1, '\w+', 1, 3) || regexp_substr(col2, '\w+', 1, 3) res3
  6  from test;

RES1  RES2 RES3
----- ---- ------
TN123 AN45 KA6789

SQL>
0 голосов
/ 07 февраля 2019

Итак, у вас есть 2 столбца с только значениями TN^AN^KA и 123^456^987 .. Вы можете использовать substr():

  select substr(A.col1,1,2)||substr(A.col2,1,3) from table A
  union all
  select substr(A.col1,4,2)||substr(A.col2,5,3) from table A
  union all
  select substr(A.col1,7,2)||substr(A.col2,9,3) from table A

Результат:

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