miércoles, 28 de agosto de 2013

Función para Oracle PL/SQL para encontrar cantidad de ocurrencias de cadenas

Hola estimados lectores :) hoy vengo con otro post flash debido al corto tiempo que me queda.

Pues hoy les entrego una simple función en oracle (que seguramente es extrapolable a otro lenguaje) que hace algo sencillo: encuentra cuantas veces en una cadena aparace un caracter o substring que desees verificar.

Por ejemplo, te sirve para saber cuantas veces está la letra 'a' en la palabra 'amapolas' ó cuantas veces existe 'si' en '111si92992sisiwewesi'.


El concepto es así:


  1. Calculamos la longitud de la cadena en la que queremos encontrar el número de ocurrencias.
  2. Le restamos la longitud de esa misma cadena pero despues de hacer un REPLACE de el caracter o substring al que deseamos encontrar el número de ocurrencias.
  3. Lo dividimos entre la longitud del caracter o substring al que deseamos encontrar el número de ocurrencias.

Y Listo!!! aqui les paso el código :) espero les sea útil.

 
CREATE OR REPLACE FUNCTION OCURRENCIES(CADENA IN VARCHAR2/*LA CADENA BASE*/,SUBCADENA IN VARCHAR2 /*LA CADENA QUE QUEREMOS ENCONTRAR LA OCURRENCIA*/) RETURN NUMBER
IS
 RESPUESTA NUMBER;
BEGIN
 SELECT 
 (LENGTH(CADENA)-LENGTH(REPLACE(CADENA,SUBCADENA,'')))/LENGTH(SUBCADENA)
 INTO RESPUESTA
 FROM DUAL;
 RETURN RESPUESTA;
 EXCEPTION
    WHEN OTHERS THEN
       RETURN 0;
END OCURRENCIES; 


Ejemplo:
 
SELECT OCURRENCIES('AMAPOLA','A') FROM DUAL;

Este ejemplo retornará 3.

4 comentarios:

  1. Muy buena rutina!
    pero para evitar el error cuando la cadena es igual a subcadena incluimos NVL:
    SELECT (LENGTH(CADENA)-NVL(LENGTH(REPLACE(CADENA,SUBCADENA,'')),0))/LENGTH(SUBCADENA)

    ResponderEliminar
    Respuestas
    1. Tienes razón con eso! Muchas Gracias, pero nunca está demás el manejo de excepciones.

      Esperamos aportar más en el futuro.

      Eliminar
  2. Muchas gracias. He reaprovechado tu codigo.

    Me ha venido estupendo

    ResponderEliminar
  3. Consulta!! u cuando la cadena es un blob? no te deja utilizar.

    ResponderEliminar