Различить возвращаемое значение в тексте - PullRequest
0 голосов
/ 30 сентября 2019

У меня проблема с выделением текста. У меня есть таблица столбцов разделенных полуколонны в моей базе данных оракула. Он имеет повторяющиеся значения, и я хочу, чтобы они отличались. Например;

with s (ID, ID_NAME) as (
select 1, 'GEORGE JOHN,GEORGE JOHN,GEORGE JOHN,GEORGE WEST,GEORGE WEST,GEORGE MICHAEL' from dual union all    
select 2, 'THOMAS EDISON,THOMAS COOK,THOMAS EDISON' from dual   
) 
SELECT * FROM S ;

Результат:

[ID  ID_NAME
1   GEORGE JOHN,GEORGE JOHN,GEORGE JOHN,GEORGE WEST,GEORGE WEST,GEORGE MICHAEL
2   THOMAS EDISON,THOMAS COOK,THOMAS EDISON][1]

НО я хочу отличные значения в тексте.

1 GEORGE JOHN,GEORGE WEST,GEORGE MICHAEL
2 THOMAS EDISON,THOMAS COOK,THOMAS EDISON

Как вы видите в 1-й строке, я неЯ не хочу повторяющихся значений. Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 02 октября 2019

После настройки CTE с тестовыми данными создайте другой CTE (tbl_parsed) со строками, созданными путем обхода строк с использованием connect by, создавая строку для каждого элемента. Наконец, выберите отличный от этого и сложите его вместе с listagg.

with s(ID, ID_NAME) as (
select 1, 'GEORGE JOHN,GEORGE JOHN,GEORGE JOHN,GEORGE WEST,GEORGE WEST,GEORGE MICHAEL' from dual union all    
select 2, 'THOMAS EDISON,THOMAS COOK,THOMAS EDISON' from dual   
),
tbl_parsed(id, element, name) as (
  select id, level element, regexp_substr(ID_NAME, '(.*?)(,|$)', 1, level, null, 1)
  from s
  connect by level <= regexp_count(ID_NAME, ',')+1
    and prior id = id
    and prior sys_guid() is not null 
)
--select * from tbl_parsed;
SELECT id, listagg(name, ',') within group (order by id) sorted
FROM (select distinct id, name from tbl_parsed)
group by id;
...