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

REGEX para seleccionar el valor n de una lista, permitiendo valores nulos

Gracias a los que respondieron. Después de leer detenidamente sus respuestas y las respuestas en el enlace proporcionado, llegué a esta solución:

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

Data
----

Lo cual se puede describir como "observe la segunda aparición de un conjunto opcional de cero o más caracteres seguidos de una coma o el final de la línea, y devuelva el primer subgrupo (que son los datos menos la coma o el final de la línea).

Olvidé mencionar que probé con el nulo en varias posiciones, múltiples nulos, seleccionando varias posiciones, etc.

La única advertencia que pude encontrar es que si el campo que busca es mayor que el número disponible, simplemente devuelve NULL, por lo que debe tenerlo en cuenta. No es un problema para mi caso.

EDITAR:estoy actualizando la respuesta aceptada para el beneficio de futuros buscadores que pueden tropezar con esto.

El siguiente paso es encapsular el código para que pueda convertirse en una función más simple y reutilizable. Aquí está la fuente de la función:

  FUNCTION  GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
    BEGIN
      RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1);
  END GET_LIST_ELEMENT;

Esto oculta las complejidades de las expresiones regulares de los desarrolladores que pueden no estar tan cómodos con él y hace que el código sea más limpio de todos modos cuando está en uso. Llámalo así para obtener el cuarto elemento:

select get_list_element('123,222,,432,555', 4) from dual;