Bases de Datos - Duda con consulta (usando firebird)

 
Vista:

Duda con consulta (usando firebird)

Publicado por Mariagt (2 intervenciones) el 15/03/2010 21:08:47
Hola a todos, tengo la siguiente informacion en una columna (mensaje) de mi base de datos:

"PRESENCIA: Presencia CF 6D;HCS:101620 ;Ubicacion:ubicacion4307v; Alarma atendida: Causa: Traslado asistido"

y necesito hacer una consulta en la que tengo que separar por columnas diferentes la informacion que ahí se muestra, es decir:

Presencia HCS Ubicación Causa
Presencia CF 6D 101620 ubicacion4307v Traslado asistido

he hecho esta consulta pero no es valida puesto que si varia el tamaño de algunas de las subcadenas ya no sirve:

"select mensaje, substring(mensaje FROM 11 for 16) Presencia, substring(mensaje FROM 32 for 6) HCS, substring(mensaje FROM 50 for 14) Ubicacion, substring(mensaje FROM 90) Causa from T_AUDIT"

Tendría que ser extrayendo subcadenas entre los dos puntos y el punto y coma... pero no se como

Agradecería vuestra ayuda

Saludos
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

RE:Duda con consulta (usando firebird)

Publicado por GabrielDR (1 intervención) el 16/03/2010 03:14:21
Pues asi as modo rápido... quedaria con la funcion position.. pero seria algo bastante grande.
Lo ideal es encontrar un caracter separador (y creo que es el punto y coma en tu caso), corregir si me equivoco.
quedaria algo grande la consulta pero funcionaria.

SELECT
substr(mensaje from 1 for POSITION (';' in CINVENTARIO_.DESCRIPCION)+1) as Col1
substr(mensaje from POSITION (';' in CINVENTARIO_.DESCRIPCION)+1)+1 for POSITION (';' in CINVENTARIO_.DESCRIPCION)+1,POSITION (';' in CINVENTARIO_.DESCRIPCION)) as col2
FROM
T_AUDIT

La idea es usar el POSITION para localizar cada una de las ";" que tienes en la cadena, solo que hay un inconveniente en la consulta sql solo puedes hacer la busqueda del position siguiente si le das el numero de caracter a comenzar. cosa que si son 5 columnas aumentaria mucho el grado de los position...
Dare un ejemplo de la logica usada.

supongamos que cadena tiene 40 caracteres... y que las ; estan cada 10.
para poder localizar el primer ;
hariamos lo siguiente;
Position(';',cadena) esto nos arrojaria 10 como resultado.
luego podrias hacer lo siguiente...
Position(';',cadena,(position(";",cadena)+1)) que le indicaria la poscion a comenzar en 11 y arrojaria como resultado 20
Position(";",cadena,(Position(';',cadena,position(";",cadena)+1) +1)) esto haria que localice el siguiente ; comenzando de la posicion 21 (que es relativa a donde se encontro la ; anterior)

Y ya seria integrar el substr usando el donde inicia y donde termina.
para obtener cada columna.. algo complicado.. pero creo que es la unica manera de sacarlo con una SQL directa.
A ver si alguien me corrige.
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

RE:Duda con consulta (usando firebird)

Publicado por Mariagt (2 intervenciones) el 16/03/2010 09:17:36
Hola Gabriel, muchas gracias por tu ayuda. Intenté usar la funcion position pero me dio este error:

Error: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, char 31
position
SQLState: HY000
ErrorCode: 335544569

Parece que no reconoce la funcion...
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