O "abuso" (como disse Colin 't Hart) de
connected by
tem um bom propósito aqui:usando REGEXP_SUBSTR
você pode extrair apenas uma das 4 correspondências (23,34,45,56):a regex [^,]+
corresponde a qualquer sequência de caracteres na string que não contenha uma vírgula. Se você tentar executar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+') as "token"
FROM DUAL
você receberá
23
. e se você tentar executar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,1) as "token"
FROM DUAL
você também receberá
23
só que agora também definimos dois parâmetros adicionais :comece procurando na posição 1 (que é o padrão), e retorne a 1ª ocorrência. Agora vamos executar:
SELECT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,2) as "token"
FROM DUAL
desta vez teremos
34
(2ª ocorrência) e usando 3
pois o último parâmetro retornará 45
e assim por diante. O uso de
connected by
recursivo junto com level
garante que você receberá todos os resultados relevantes (mas não necessariamente na ordem original!):SELECT DISTINCT REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) as "token"
FROM DUAL
CONNECT BY REGEXP_SUBSTR ('23,34,45,56','[^,]+',1,LEVEL) IS NOT NULL
order by 1
retornará:
TOKEN
23
34
45
56
que não apenas contém todos os 4 resultados, mas também os divide em linhas separadas no conjunto de resultados!
Se você brincar com ele - pode dar-lhe uma visão mais clara do assunto.