PDA

Ver la Versión Completa : Select con where filtrando a un nivel determinado de un código


HombreSigma
09-09-2004, 20:05:15
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

jachguate
09-09-2004, 21:04:01
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).


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;
/



Una vez hecho esto, es tan simple como:

Select *
from tabla
where NivelDelCodigo(codigo) = 2;


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.

;)

HombreSigma
10-09-2004, 20:03:21
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

jachguate
10-09-2004, 21:50:33
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...

HombreSigma
11-09-2004, 19:12:14
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.

jachguate
11-09-2004, 20:13:57
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.

Codificar en Delphi, por ejemplo

¿en delphi? :eek: :confused: :confused:

HombreSigma
12-09-2004, 22:45:23
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.

jachguate
13-09-2004, 02:49:26
Esto mas parece para un examen que para una base de datos del mundo real... :confused: de todas formas, te remito a la documentación oficial de oracle (http://tahiti.oracle.com)

Hasta luego

;)