Convertir cadena de exto en una fila SQL ordenada



Muchas veces tenemos almacenado un valor que está separado por un carácter pero en la misma variable o campo, y deseamos pasarlo a filas separado por el carácter indicado.
Para esto podemos utilizar la función de Oracle REGEXP_SUBSTR con la ayuda de la función CONNECT BY LEVEL.

Ejemplo: Se tiene una cadena con los nombres más populares de Colombia, se desea que la cadena aparezca en forma de lista.

--Cadena
Nombres := 'Enrique,Carlos,Monica';

--Codigo
declare
 
  nombres varchar2(200) := 'Enrique,Carlos,Monica' ;
 
  cursor cur_cadena_a_fila is
  SELECT REGEXP_SUBSTR(nombres, '[^' || ',' || ']+', 1, LEVEL) VALOR
    FROM DUAL
  CONNECT BY REGEXP_SUBSTR(nombres, '[^' || ',' || ']+', 1, LEVEL) IS NOT NULL;
 
begin

  for nombres in cur_cadena_a_fila loop
    dbms_output.put_line(nombres.VALOR);
  end loop;

End;

Output:


Utilizando solo el select en la cadena puede ser.

SELECT REGEXP_SUBSTR('Enrique,Carlos,Monica', '[^' || ',' || ']+', 1, LEVEL) VALOR
    FROM DUAL
  CONNECT BY REGEXP_SUBSTR('Enrique,Carlos,Monica', '[^' || ',' || ']+', 1, LEVEL) IS NOT NULL;

Output:

¿Como saber si una cadena tiene números o texto PL/SQL?



Muchas veces queremos saber si una variable contiene números o si contiene texto, sucede que a veces es necesario validar la cadena para que no ocurran errores, existen muchas maneras de hacerlo, pero utilizando las funciones de expresiones regulares se puede hacer de una manera fácil y rápida.
Ejemplo: Se requiere saber si la cadena contiene algún número.

select REGEXP_REPLACE('Juan Maria 25 años vive en la calle 13 de la avenida 14','[A-Za-z]*')
from dual;

Utilizando esta expresión regular replace se quitan todos los caracteres dejando únicamente los números
Output:
 

En esta salida vemos que un conserva los espacios, para solucionar esto ponemos un espacio en la expresión regular de búsqueda para que entienda que los espacios también deben ser remplazados.

select REGEXP_REPLACE('Juan Maria 25 años vive en la calle 13 de la avenida 14',' *[A-Za-z]*')
from dual;


Output:
  

Si se desesa saber si una cadena de números tiene texto, se cambia la expresión [A-Za-z] por [0-9].

select REGEXP_REPLACE('1Juan Maria 25 años vive en la calle 13 de la avenida 14',' *[0-9]*')
from dual;
 
Output: