FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Select con where filtrando a un nivel determinado de un código
Saludos:
Tengo una tabla con un código que tiene un determinado número de níveles, donde cada nivel del código se separa por un punto. Supongase una tabla como esta: Código Cantidad ------------ ---------- A.1.2.1.2 200 BB 300 BB.1 400 BB.1.2.1.13 500 De tal manera que una consulta a una tabla como la anterior me entregará para el nivel uno: A 200 BB 1200 Para el nivel 2: A 200 A.1 200 BB 1200 BB.1 900 ¿Con que tipo de instrucción puedo hacer una forma genérica de consulta has ta n niveles como la anterior? Gracias
__________________
SigmaMan |
#2
|
||||
|
||||
En casos como este, en que veo que la cantidad de caracteres por nivel no es fija, podes hacer una función que te devuelva el nivel de un código en particular (contando los puntos, por ejemplo).
Se me ocurre algo como: (tené en cuenta que no he verificado el código). Código:
Create or replace function NivelDelCodigo(codigo in VarChar2) return number IS Nivel Number; Begin if codigo is Null Then return(0); nivel := 1; Loop if InStr(codigo, '.', 1, nivel) > 0 Then nivel := nivel + 1; else exit; end if; end Loop; return(nivel); end; /
Claro que esto no es óptimo... y la sentencia será lenta en tablas con mucha información... en ese caso, es mejor guardar en un campo el nivel del código, crear indices que lo involucren de acuerdo a las consultas que haremos y utilizar este campo en los predicados. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#3
|
|||
|
|||
Select sin programar en ningún lenguaje.
En realidad debo utilizar solamente el SELECT de SQL, para reutilizar la sentencia cuando convenga sin necesidad de ejecutar código de cualquier lenguaje diferente de SQL.
Se que existe una instrucción 'occurs' o de nombre similar que puede utilizarse con la sentencia SELECT para contar los puntos delimitadores de niveles. SELECT A.Codigo, SUM(Valor) FROM A Pero como A.Codigo o B.Codigo tienen n niveles debo hacer la comparación de los primeros caracteres que vayan hasta el nivel j, seleccionado por el usuario. TABLA A Codigo Valor A 20 A.1 30 A.1.1 50 BB 20 BB.1 20 De tal manera que si la consulta anterior se hace sobre el nivel 1 daría: A 100 BB 40 Al nivel 2: A.1 80 BB.1 20
__________________
SigmaMan |
#4
|
||||
|
||||
La stored function mencionada, está en pl/sql, que es el "lenguaje" de la base de datos oracle, y que se ejecuta en el servidor, sin necesidad de instalar nada adicional, con lo que no representa ningún problema.
Como he dicho antes, es probable que haya forma de plantearlo, con el uso de otra función, y que de esta manera sea mas óptimo, pero eso ya te lo dejo a vos. Según veo lo que has planteado..... mi solución sigue siendo válida. Hasta luego. pd. Agregar que no conozco ninguna función o clausula de nombre occurs...
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate Última edición por jachguate fecha: 10-09-2004 a las 21:54:46. |
#5
|
|||
|
|||
Gracias por la información.
Se que se puede hacer por código y me parece que tu propuesta está bien. Lo que ocurre, es que tengo una aplicación que lleva funcionando ya varios años y debo adecuarme a como están planteadas las consultas, las cuales solamente se hacen a travès de meras sentencias SELECT que se almacenan para luego ser reutilizadas. Codificar en Delphi, por ejemplo, significaría desechar todo un montaje que se gastó varios meses y que la verdad, para el caso de esta aplicación, no es muy conveniente.
__________________
SigmaMan |
#6
|
||||
|
||||
Cita:
Cita:
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
|||
|
|||
??
Quiero decir que se puede hacer código Delphi, POR EJEMPLO, para obtener el resultado deseado, aunque pudiera ser otro lenguaje cualquiera o PL SQL o lo que sea.
Pero quiero que alguien me ayude a construir UNA Y SOLO UNA sentencia Select en SQL, sin bucles ni nada de código de programación diferente. Se que existen funciones usadas con el SELECT en Oracle que hacen lo que necesito. Gracias por cualquier información, o por indicarme alguna dirección donde pueda obtener algún manual de la sentencia SELECT de Oracle con todas las funciones que puedan utilizarse dentro de ella.
__________________
SigmaMan |
#8
|
||||
|
||||
Esto mas parece para un examen que para una base de datos del mundo real... de todas formas, te remito a la documentación oficial de oracle
Hasta luego
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
|
|
|