sql >> Base de Datos >  >> RDS >> Oracle

Dividir valores separados por comas en columnas en Oracle

¡Tener cuidado! La expresión regexp_substr del formato '[^,]+' no devolverá el valor esperado si hay un elemento nulo en la lista y desea ese elemento o uno posterior. Considere este ejemplo donde el cuarto elemento es NULL y quiero el quinto elemento y, por lo tanto, espero que se devuelva el '5':

SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;

R
-
6

¡Sorpresa! ¡Devuelve el quinto elemento NO NULO, no el quinto elemento real! Se devolvieron datos incorrectos y es posible que ni siquiera los detecte. Prueba esto en su lugar:

SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;

R
-
5

Entonces, el REGEXP_SUBSTR corregido anteriormente dice que busque la quinta aparición de 0 o más caracteres delimitados por comas seguidos de una coma o el final de la línea (permite el siguiente separador, ya sea una coma o el final de la línea) y cuando se encuentra, devuelve el primer subgrupo (los datos NO incluyen la coma o el final de la línea).

El patrón de coincidencia de búsqueda '(.*?)(,|$)' explicó:

(             = 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

EDITAR:se agregó más información y se simplificó la expresión regular.

Consulte esta publicación para obtener más información y una sugerencia para encapsular esto en una función para una fácil reutilización:REGEX para seleccionar el valor n de una lista, lo que permite valores nulos. Es la publicación donde descubrí el formato '[^,]+' tiene el problema Desafortunadamente, es el formato de expresiones regulares que verá con mayor frecuencia como la respuesta a las preguntas sobre cómo analizar una lista. Me estremezco al pensar en todos los datos incorrectos que devuelve '[^,]+' !