Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Extraer partes de cadena separada por comas. ¿Es posible?

Estas en el tema de Extraer partes de cadena separada por comas. ¿Es posible? en el foro de Oracle en Foros del Web. Tengo un campo tipo LONG donde se guarda una cadena que PUEDE estar sepada por comas. Esto es, puede haber estos valores: Código: campo -------------------------------------------- ...
  #1 (permalink)  
Antiguo 16/04/2010, 19:54
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 10 años, 9 meses
Puntos: 36
Pregunta Extraer partes de cadena separada por comas. ¿Es posible?

Tengo un campo tipo LONG donde se guarda una cadena que PUEDE estar sepada por comas. Esto es, puede haber estos valores:
Código:
                    campo
--------------------------------------------
cadena 1
cadena 2, cadena 3
cadena 4, cadena 5, cadena 6, cadena 7, ...
Intento separar las dos primeras subcadenas que estén separadas por una coma, dejando como tercer cadena lo que sobre. En concreto, necesito obtener esto como resultado:
Código:
resultado 1 | resultado 2 | resultado 3
------------+-------------+--------------
cadena 1    |             |
cadena 2    | cadena 3    |
cadena 4    | cadena 5    | cadena 6, cadena 7, ...
¿Será posible?.

He intentado con SUBSTR():
Código SQL:
Ver original
  1. SELECT SUBSTR(campo, 0, INSTR(campo, ',')-1), SUBSTR(campo, INSTR(campo, ',')-1) FROM tabla;
¿Pero cómo obtendría el resultante para seguirlo cortando?, ¿qué pasa cuando no hay más de una "subcadena"?

Igual he intentado con expresiones regultares:
Código SQL:
Ver original
  1. SELECT REGEXP_SUBSTR(campo, '([[:alnum:]]| )*[^,]', 1, 1), REGEXP_SUBSTR(campo, '([[:alnum:]]| )*[^,]', 1, 2) FROM tabla;
¿Pero cómo digo para el tercer resultado "y todas las demás coincidencias"? ... o cuál sería la expresión regular para no contar las dos primeras coincidencias?

Esperaría resolver esto desde Oracle. Cualquier sugerencia es bienvenida.
__________________
I ♥ The Music!
  #2 (permalink)  
Antiguo 21/04/2010, 10:20
Avatar de 8vio  
Fecha de Ingreso: marzo-2008
Ubicación: Detras del monitor
Mensajes: 168
Antigüedad: 12 años, 6 meses
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.

Etiquetas: comas, subcadena
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:03.