Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

conectar por cláusula em regex_substr


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.