Cuidado! A expressão regexp_substr do formato
'[^,]+'
não retornará o valor esperado se houver um elemento nulo na lista e você desejar esse item ou um depois dele. Considere este exemplo em que o 4º elemento é NULL e eu quero o 5º elemento e, portanto, espero que o '5' seja retornado:SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Surpresa! Ele retorna o 5º elemento NON-NULL, não o 5º elemento real! Dados incorretos retornados e você pode nem pegá-los. Tente isso em vez disso:
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Portanto, o REGEXP_SUBSTR corrigido acima diz para procurar a 5ª ocorrência de 0 ou mais caracteres delimitados por vírgula seguidos por uma vírgula ou o final da linha (permite o próximo separador, seja uma vírgula ou o final da linha) e quando encontrado retorna o 1º subgrupo (os dados NÃO incluem a vírgula ou o final da linha).
O padrão de correspondência de pesquisa
'(.*?)(,|$)'
explicou:( = Start a group
. = match any character
* = 0 or more matches of the preceding character
? = Match 0 or 1 occurrences of the preceding pattern
) = End the 1st group
( = Start a new group (also used for logical OR)
, = comma
| = OR
$ = End of the line
) = End the 2nd group
EDIT:Mais informações adicionadas e simplificadas o regex.
Veja este post para mais informações e uma sugestão para encapsular isso em uma função para facilitar a reutilização:REGEX para selecionar o enésimo valor de uma lista, permitindo nulos É o post onde descobri o formato
'[^,]+' tem o problema. Infelizmente, é o formato regex que você verá com mais frequência como a resposta para perguntas sobre como analisar uma lista. Estremeço ao pensar em todos os dados incorretos sendo retornados por '[^,]+'
!