Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/04/2010, 10:20
Avatar de 8vio
8vio
 
Fecha de Ingreso: marzo-2008
Ubicación: Detras del monitor
Mensajes: 168
Antigüedad: 16 años, 1 mes
Puntos: 6
Respuesta: Extraer partes de cadena separada por comas. ¿Es posible?

Hola que tal,

Yo cree esta funcion para eso

Código:
FUNCTION GetToken(stringvalues  VARCHAR2,
                  indice        NUMBER,
                  delim         VARCHAR2 
                 )
RETURN VARCHAR2
   
IS

   start_pos NUMBER; -- Posición inicial de cada substring
   end_pos   NUMBER; -- Posición final de cada substring
   
BEGIN

   -- Si el primer indice es uno
   IF indice = 1 THEN
   
         start_pos := 1; -- La posición inicial sera 1
       
   ELSE
       
         /* Se calcula la posición del delimitador segun el substring que se desea conseguir  */
         /*             Ejm: 12;13;  Se desea el inidice 2 del delim ; --> start_pos=3        */
        
         start_pos := instr(stringvalues, delim, 1, indice - 1);
         
         -- Si la posicion inicial es 0 se retorna null
         IF start_pos = 0 THEN
         
             RETURN NULL;
             
         ELSE
         
             -- Se calcula la posición inicial del substring sin importar el largo del delimitador
             start_pos := start_pos + length(delim);
             
         END IF;
       
   END IF;

   -- Se calcula la posición final del substring 
   end_pos := instr(stringvalues, delim, start_pos, 1);

   IF end_pos = 0 THEN -- Se retorna el ultimo valor del arreglo
   
         RETURN substr(stringvalues, start_pos);
       
   ELSE -- Se retorna el valor del arreglo segun el inidice y delim indicado
   
         RETURN substr(stringvalues, start_pos, end_pos - start_pos);
       
   END IF;

END GetToken;
En ella pasas el delimitador ejm ; y el valor de coincidencia que quieres, por ejm el primero valor antes de un ;---> indice=1 delim=; stringvalues= string de caracteres.

Si son varios cuentas la cantidad de delim que existen

Código:
SELECT length(stringvalues) - length(REPLACE(stringvalues,';'))                
                  INTO count
                  FROM dual;
Y puedes guardar cada valor en una variable

Código:
salida:=GetToken('11;12;',count,';');
donde count seria el numero de valor(1 primer,2 segundo)

Igualemente la menciono en este otro post

http://www.forosdelweb.com/f100/func...record-783668/

Con esta función puedes empezar a jugar y probar para el resultado que necesitas.

Saludos.