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

Dividir valores separados por vírgulas em colunas no Oracle


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 '[^,]+' !