Как я могу удалить дубликаты данных в столбце - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы удалить дубликаты и показать один раз

например

SELECT 'apple, apple, orange'
FROM dual;

Я бы хотел показать

apple, orange

в качестве другого примера.

SELECT 'apple, apple, apple, apple,'
FROM dual;

Я просто хочу показать

apple

Этот код показывает

with data as
(
  select 'apple, apple, apple, apple' col from dual
)
select listagg(col, ',') within group(order by 1) col
  from (
        select distinct regexp_substr(col, '[^,]+', 1, level) col
          from data
        connect by level <= regexp_count(col, ',')
       )

Ответы [ 3 ]

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

В форуме Oracle есть несколько опций:

with data as
 (
 select 

'5,5,5,5,6,6,5,5,5,6,7,4,1,2,1,4,7,2' col from dual
)
 select listagg(col, ',') within group(order by 1) col
 from (
    select distinct regexp_substr(col, '[^,]+', 1, level) col
    from data
    connect by level <= regexp_count(col, ',')
   )

Просто замените числа с вводом на 'apple, apple, orange'

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

Использование trim и distinct с функциями regexp очень важно для получения желаемого результата как

select listagg(str,',') within group (order by 0) as Result
from
(
 select distinct trim(regexp_substr('apple, apple, orange','[^,]+', 1, level)) as str
   from dual
connect by level <= regexp_count('apple, apple, orange',',') + 1
);

Rextester Demo

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

Нечто подобное устранит дубликаты:

Демонстрация SQL

with temp as
(
    select 1 Name, 'test1' Project, 'apple, apple, orange' Error  from dual
    union all
    select 2, 'test2', 'apple, apple, apple, apple,' from dual
), split as (
    select distinct
      t.name, t.project,
      trim(regexp_substr(t.error, '[^,]+', 1, levels.column_value))  as error
    from 
      temp t,
      table(cast(multiset(select level 
                          from dual connect by  level <= length (regexp_replace(t.error, '[^,]+'))  + 1) as sys.OdciNumberList)) levels
)
SELECT Name, listagg(Error, ',') within group(order by 1) as result 
FROM split
GROUP BY Name

ВЫХОД

Как видите, вы получаете NULL, потому что эта лишняя запятая ,

enter image description here

enter image description here

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