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

[SOLUCIONADO] Split con parámetros (SQL ORACLE)

Estas en el tema de Split con parámetros (SQL ORACLE) en el foro de Oracle en Foros del Web. Buen dia, Estoy entrando en el mundo del Oracle y utilizo la herramienta TOAD, lo que necesito es un Query, no función, ni store procedure ...
  #1 (permalink)  
Antiguo 26/06/2013, 12:05
Avatar de re_jill_123  
Fecha de Ingreso: mayo-2013
Ubicación: México
Mensajes: 9
Antigüedad: 10 años, 10 meses
Puntos: 0
Pregunta Split con parámetros (SQL ORACLE)

Buen dia,
Estoy entrando en el mundo del Oracle y utilizo la herramienta TOAD, lo que necesito es un Query, no función, ni store procedure , para poder separar mi cadena: Ejemplo:

4*hola5*abcde15*programacionA152*140*5*final4*... etc

Donde antes de cada * el numero que le precede es el total de caracteres que tomara en el siguiente split.
antes de cada * pueden ser 1,2 o 3 digitos.

El resultado seria:

hola
abcde
programacionA15
14

final

El resultado puede ser en filas o columnas (es indistinto)

Gracias, saludos!!
  #2 (permalink)  
Antiguo 27/06/2013, 00:17
Avatar de zarwar  
Fecha de Ingreso: mayo-2013
Ubicación: Madrid
Mensajes: 77
Antigüedad: 10 años, 11 meses
Puntos: 4
Respuesta: Split con parámetros (SQL ORACLE)

Sin ninguna función lo veo muy complicado. Al menos se necesitaría funciones estandar para cortar y esto lo digo sin pensar una solución concreta exclusivamente con este tipo de funciones.

¿Por qué dices que no a utilizar funciones en la query?

Un saludo
__________________
Entra en mi blog sobre base de datos Oracle:
http://mundodb.es
  #3 (permalink)  
Antiguo 27/06/2013, 10:06
Avatar de re_jill_123  
Fecha de Ingreso: mayo-2013
Ubicación: México
Mensajes: 9
Antigüedad: 10 años, 10 meses
Puntos: 0
Mensaje Respuesta: Split con parámetros (SQL ORACLE)

Cita:
Iniciado por zarwar Ver Mensaje
Sin ninguna función lo veo muy complicado. Al menos se necesitaría funciones estándar para cortar y esto lo digo sin pensar una solución concreta exclusivamente con este tipo de funciones.

¿Por qué dices que no a utilizar funciones en la query?

Un saludo
Bueno la verdad tengo una semana utilizando el TOAD y el ORACLE SQL, antes he trabajo con SQL SERVER, y no tengo mucha noción sobre las funciones, bueno tengo este query:

select LEVEL,regexp_substr('2*C29*ABCDEB_349*ABCDIB_352*N 221*ABCDEFGHIJ KL MNONICO0*2*O212*AAAAAAAAAAAA22*ARBCPRTVNSTUN CRBVGYYHS','[^*]+', 1, level) from dual
connect by LEVEL <= REGEXP_COUNT('2*C29*ABCDEB_349*ABCDIB_352*N221*ABC DEFGHIJ KL MNONICO0*2*O212*AAAAAAAAAAAA22*ARBCPRTVNSTUN CRBVGYYHS','[^*]+');


lo que me retorna las cadenas cortadas por cada asterisco que encuentra, ahora como poder pasar el parámetro anterior? para obtener otro substring únicamente con el número? para luego utilizar esos números y obtener al fin mi cadena final..

si tenéis una función o algo esta bien lo acepto, me gustaría que me ayudaran a saber que funciones o herramientas puedo utilizar! gracias!

Si lo llego a resolver, sin duda alguna compartiré la solución, Saludos y gracias por el interés zarwar
  #4 (permalink)  
Antiguo 28/06/2013, 03:41
Avatar de zarwar  
Fecha de Ingreso: mayo-2013
Ubicación: Madrid
Mensajes: 77
Antigüedad: 10 años, 11 meses
Puntos: 4
Respuesta: Split con parámetros (SQL ORACLE)

Por lo que te he entendido, te da igual, que sea una cadena o una serie de registros.

La opción que pusiste, entiendo que te serviría salvo que sobrarían los valores, que determinan la longitud de la cadena, aunque si lo estás planteando es porque no puedes evitar tenerlas y supongo, que tampoco podrás incluir otro caracter especial por ejemplo un '|', para delimitar registros. La verdad es que es una información redundante, ya que los asteríscos ya determina el principio y fin.

Meter mano a la expresión regular lo veo complicado.

Yo la opción que se me ocurre es hacer una función PL/SQL, para limpiar la cadena previamente.

Código SQL:
Ver original
  1. SELECT LEVEL,
  2.        regexp_substr(fn_limpia_cadena('2*C29*ABCDEB_349*ABCDIB_352*N 221*ABCDEFGHIJ KL MNONICO0*2*O212*AAAAAAAAAAAA22*ARBCPRTVNSTUN CRBVGYYHS'),'[^*]+', 1, level)
  3.   FROM dual
  4. CONNECT BY LEVEL <= REGEXP_COUNT(fn_limpia_cadena('2*C29*ABCDEB_349*ABCDIB_352*N221*ABC DEFGHIJ KL MNONICO0*2*O212*AAAAAAAAAAAA22*ARBCPRTVNSTUN CRBVGYYHS'),'[^*]+');

Siendo fn_limpia_cadena una función que recibe como parámetro la cadena inicial y quitaría las longitudes de las cadenas.
Para ello recorrería con un bloque WHILE e iría mediante funciones substr e instr por un lado descomponiendo la cadena y por otro componiendo el resultado de la función.

No se a lo mejor a alguien se le ocurre alguna opción mejor.

Un saludo
__________________
Entra en mi blog sobre base de datos Oracle:
http://mundodb.es
  #5 (permalink)  
Antiguo 02/07/2013, 17:25
Avatar de re_jill_123  
Fecha de Ingreso: mayo-2013
Ubicación: México
Mensajes: 9
Antigüedad: 10 años, 10 meses
Puntos: 0
Respuesta: Split con parámetros (SQL ORACLE)

Gracias sarwar, he resuelto el query, utilice SQL, sin PL, gracias por tu ayuda, es buena tu propuesta pero queria resolverlo en un query sin utilizar funciones y lo he conseguido, aqui os comparto la solución:

DESDE (n) POSICIONES...
Código SQL:
Ver original
  1. SELECT X+1 X,VAL,V1,R2,V2,
  2. SUBSTR(REGEXP_SUBSTR(VAL,'[^*]+',1,X),1,V2)R3,SUBSTR(REGEXP_SUBSTR(VAL,'[^*]+',1,X),V2+LENGTH(LENGTH(V2)))V3 FROM(
  3. SELECT X+1 X,VAL,V1,
  4. SUBSTR(REGEXP_SUBSTR(VAL,'[^*]+',1,X),1,V1)R2,SUBSTR(REGEXP_SUBSTR(VAL,'[^*]+',1,X),V1+LENGTH(LENGTH(V1)))V2 FROM(
  5. SELECT X+1 X,VAL, REGEXP_SUBSTR(VAL,'[^*]+',1,X)V1 FROM (
  6. SELECT 1 X,CADENA_CON_ASTERISCOS VAL FROM TABLA_X WHERE X='Y')))
... HASTA (n) posiciones;

y el numero de lineas depende que cuantos SPLIT queramos obtener, de ser 10 llegaríamos hasta V10, R9, y EN EL SELECT AGREGANDO LAS COLUMNAS QUE HEMOS OBTENIDO EN LA SUBCONSULTA ANIDADA, SALUDOS!! ....

Última edición por gnzsoloyo; 02/07/2013 a las 19:23

Etiquetas: cadenas, cortar, querys, regexp, split, sql
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 18:18.