Oracle - dividir un campo separado por comas oracle

   
Vista:

dividir un campo separado por comas oracle

Publicado por pruebapedro (5 intervenciones) el 26/08/2015 13:55:01
Buenas,
soy nuevo en este foro, y tengo el siguiente problema:

tengo una tabla
id
codigo

con los siguientes datos
1 121,12,12,12,12,123
2 34,45,45,45
3 45,56,566,56,5656

y quiero saber si es posible en una query hacer que salga algo así

1 121
1 12
1 12
........
3 45
3 56

lo he hecho con un pl, pero me han dicho que lo intente hacer en una query y no sé si se puede..
muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

dividir un campo separado por comas oracle

Publicado por Rafael (178 intervenciones) el 26/08/2015 14:36:09
Depende de la version que tengas si es posible o no...

Cuando menos te puedo garantizar que en 11g R2 funciona:

1
2
3
4
5
6
select distinct A.id
     , regexp_substr(A.codigo,'[^,]+', 1, level) as valores
     , level
from   test_table A
connect by regexp_substr(codigo, '[^,]+', 1, level) is not null
order  by id, level;

Puedes ver aqui el resultado:
Imagen

Espero te sirva, Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

dividir un campo separado por comas oracle

Publicado por pruebapedro (5 intervenciones) el 26/08/2015 15:19:33
Pues muchisimas gracias, era esto justo lo que buscaba
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

dividir un campo separado por comas oracle

Publicado por Rafael (178 intervenciones) el 27/08/2015 08:17:23
Pues si te a servido no estaria de mas valorar la respuesta con un mas uno ...

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

dividir un campo separado por comas oracle

Publicado por Ana (5 intervenciones) el 27/08/2015 11:21:11
Lo siento mucho, ni me había dado cuenta de eso. Es la primera vez que utilizo el foro. En cualquier caso quiero agradecerte la rapidez y lo bien hecha que esta la respuesta.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

dividir un campo separado por comas oracle

Publicado por Alixandro (63 intervenciones) el 09/09/2015 00:36:28
Saludos, Este codigo ademas de la solucion dada, tambien te puede servir. puedes pasar una cadena separada por cualquier caracter y escoger el valor de la posicion que desee.

Ejemplo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Select id,
            Split(codigo,',',6) Codigo,  --- esto devuelve el 123
            Split(codigo,',',1) Codigo,  --- esto devuelve el 121
             ...........
             ...........
From test-Table
 
Function Split (p_cadena     in varchar2,
                p_simbolo    in char,
                p_ocurrencia in number default vUno) return varchar2 Is
--
v_txt     varchar2(200);
v_pos_ini integer := 0;
v_pos_fi  integer;
--
Begin
    -- Función que separa cadenas de texto (p_cadena) por el símbolo p_simbolo
    -- Devuelve la ocurrencia p_ocurrencia
    -- Devuelve null si la ocurrencia no existe
    -- Devuelve el símbolo p_simbolo si no hay ningún carácter entre dos
    --ocurrencias de p_simbolo
    if p_ocurrencia > 1 then
      v_pos_ini := instr (str1 => p_cadena,
                          str2 => p_simbolo,
                          pos  => 1,
                          nth  => p_ocurrencia - 1);
    end if;
    --
    v_pos_fi := instr (str1 => p_cadena,       -- test string
                       str2 => p_simbolo,      -- string to locate
                       pos  => 1,              -- position
                       nth  => p_ocurrencia);  -- occurrence number
    --
    if v_pos_ini = v_pos_fi then
      if p_ocurrencia = 1 then
        v_txt := substr (str1 => p_cadena, pos => 1);
      end if;
    elsif v_pos_ini > v_pos_fi then
      v_txt := substr (str1 => p_cadena, pos => v_pos_ini + 1);
    elsif v_pos_fi = v_pos_ini + 1 then
      v_txt := p_simbolo;
    else
      v_txt := substr (str1 => p_cadena, pos => v_pos_ini + 1,
                       len  => (v_pos_fi - v_pos_ini) - 1);
    end if;
    --
    return v_txt;
End Split;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar