sql >> Base de Datos >  >> RDS >> Oracle

¿Cómo eliminar duplicados de la lista separada por espacios por Oracle regexp_replace?

Si entiendo bien, no solo necesita reemplazar ',' con un espacio, sino también eliminar duplicados de una manera más inteligente.

Si modifico esa expresión para que funcione con espacio en lugar de ',', obtengo

select regexp_replace('A B A A C D' ,'([^ ]+)( [ ]*\1)+', '\1') from dual

lo que da 'A B A C D' , no lo que necesitas.

Una forma de obtener el resultado que necesita podría ser la siguiente, un poco más complicada:

with string(s) as ( select 'A B A A C D' from dual)    
    select listagg(case when rn = 1 then str end, ' ') within group (order by lev)
    from (
            select str,  row_number() over (partition by str order by 1) rn, lev
            from (
                SELECT trim(regexp_substr(s, '[^ ]+', 1, level)) str,
                       level as lev
                  FROM string
                CONNECT BY instr(s, ' ', 1, level - 1) > 0
                )
         )

Mi principal problema aquí es que no puedo crear una expresión regular que verifique duplicados no adyacentes, por lo que necesito dividir la cadena, buscar duplicados y luego agregar nuevamente los valores no duplicados, manteniendo el orden.

Si no le importa el orden de los tokens en la cadena de resultados, esto se puede simplificar:

with string(s) as ( select 'A B A A C D' from dual)
select listagg(str, ' ') within group (order by 1)
from (
        SELECT distinct trim(regexp_substr(s, '[^ ]+', 1, level)) as str
          FROM string
        CONNECT BY instr(s, ' ', 1, level - 1) > 0
     )