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;
/
Una vez hecho esto, es tan simple como:
Código SQL
[-]
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.
