Uma coluna da minha tabela armazena uma lista de valores separados por vÃrgula (sei que é um design ruim, mas a refatoração não é uma opção no momento). Parece que encontrei uma solução funcional, mas receio que não seja muito eficiente:
select distinct test_id , regexp_substr(str_data,'[^,]+', 1, level)
from
(
select 1 as test_id, '1,2,3' as str_data from dual
union all
select 2 as test_id, '4,5,6' as str_data from dual
)test_data
connect
by
regexp_substr(str_data, '[^,]+', 1, level) is not null
Eu não gosto que eu tenha que usar distinct
. Existe uma abordagem melhor ?
Obrigada.
Seu
CONNECT BY
une todas as linhas a todas as outras (incluindo ela mesma) N vezes. Esta é uma junção cruzada automática múltipla. Posso ver como ele pode se comportar mal em termos de desempenho quando o número de registros aumenta.Sugiro uma consulta como esta:
Substitua 1000 pelo número máximo de elementos (ou calcule-o com uma
COUNT
subconsulta interna). Cada linha será consultada apenas n vezes (onde n é o número de vÃrgulas).Além disso, se o desempenho for crÃtico, use
INSTR
eSUBSTR
em vez deREGEX
.