Oracle: SQL для замены элементов в строке элементами другой строки - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть столбец «col1», например: «a, b, x, y, z» (упорядоченная строка)

Другой столбец «col2» похож на: «a, x» или «b»., y, z '(упорядоченная строка)

Все строковые значения в "col2" генерируются подзапросом.Так что это не постоянно.

Но значение в "col1" является постоянным.То есть col1 = 'a, b, x, y, z'

create table test (col1 varchar2(20), col2 varchar2(10)); 

insert into test values ('a,b,x,y,z','a,x');

insert into test values ('a,b,x,y,z','b,y,z');

Нужна помощь с заменой в одном sql.


Нужна помощь для замены элементов на "col1 "с" col2 ".

Например,

when col2='a,x', the result should be : 'b,y,z'

when col2='b,y,z', the result should be : 'a,x'

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вот забавный способ сделать это:

select col1, col2,
       ltrim(regexp_replace(translate(replace(col1,','),','||replace(col2,','),',')
                            ,'(.)',',\1'),',') as col3
from   test;

То есть: (чтение вызовов функций по мере их выполнения изнутри)

  • Удаление запятыхиз обеих строк
  • Используйте TRANSLATE (), чтобы удалить символы второй строки из первой строки
  • Используйте REGEXP_REPLACE для добавления запятых перед каждым символом оставшейся строки
  • Trimведущая запятая
0 голосов
/ 29 ноября 2018

Вот один из вариантов;Я включил столбец ID, чтобы сделать его проще.Я надеюсь, что столбец, подобный этому, существует в вашем реальном случае.

Идея заключается в следующем:

  • разделить каждый столбец (col1, col2) в строки
    • CTE one представляет col1 строки
    • CTE two представляет col2 строки
  • , используяоператор набора MINUS, вычитание этих двух наборов строк
  • с использованием LISTAGG, агрегирование результата

SQL> select * From test;

        ID COL1                 COL2
---------- -------------------- ----------
         1 a,b,x,y,z            a,x
         2 a,b,x,y,z            b,y,z

SQL> with
  2  one as
  3    (select id, regexp_substr(col1, '[^,]+', 1, column_value) col
  4       from test,
  5            table(cast(multiset(select level from dual
  6                                connect by level <= regexp_count(col1, ',') + 1
  7                               ) as sys.odcinumberlist))
  8    ),
  9  two as
 10    (select id, regexp_substr(col2, '[^,]+', 1, column_value) col
 11       from test,
 12            table(cast(multiset(select level from dual
 13                                connect by level <= regexp_count(col2, ',') + 1
 14                               ) as sys.odcinumberlist))
 15    ),
 16  t_minus as
 17    (select id, col from one
 18     minus
 19     select id, col from two
 20    )
 21  select id, listagg(col, ',') within group (order by col) result
 22  From t_minus
 23  group by id;

        ID RESULT
---------- --------------------
         1 b,y,z
         2 a,x

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