Select campo cercano superior e inferior

Estoy haciendo una página web en la que se pueden consultar las tiendas de una determinada empresa.
En la tabla, uno de los campos es el código postal, y en la página de consulta de tiendas, he creado un campo de texto de formulario para que el visitante pueda introducir SU código postal.
Al hacerlo y pinchar en "buscar", el programa podría buscar dicho código para las tiendas existentes, pero como es muy posible que no exista ninguna tienda con dicho CP, lo bueno sería mostrarle las más cercanas.
Como los códigos postales de las ciudades están asignados consecutivamente por proximidad (más o menos), necesitaría buscar las tiendas con CP cercano al introducido. Por ejemplo, buscar las 2 tiendas con código superior al indicado y las 2 con el código inferior.
Es decir, que si introducen el código 48665 y en la base de datos hay tiendas con los códigos 47600, 47887, 48660, 48664, 49900 y 52012, el programa debería devolver como tiendas más cercanas las 2 con el código inferior más próximo (48660, 48664) y las 2 con el código superior más próximo (49900, 52012).
Si no fuese posible conseguir las 2 por encima y por debajo, me conformaría con la más próxima por encima y debajo ;-)
El caso es que no se me ocurre como plantear la sentencia select de SQL para obtenerlo.

1 respuesta

Respuesta
1
Esta es la solución, pero siempre desde oracla, ya que se hace uso de la pseudocolumna llamada rownum
select * from tienda
where cp = CP_INTRODUCIDO
OR CP IN (SELECT CP FROM (SELECT CP FROM COD_POSTAL WHERE CP < CP_INTRODUCIDO ORDER BY CP DESC) WHERE ROWNUM < 3)
OR CP IN (SELECT CP FROM (SELECT CP FROM COD_POSTAL WHERE CP>CP_INTRODUCIDO ORDER BY CP) WHERE ROWNUM < 2)
Explicación:
hay varias select
La primera condición where coge el primer código postal o los dos inmediatos anteriores o los dos inmediatos posteriores.
Para coger los dos inmediatos anteriores, tenemos que colocar la tabla cod_postal por código postal en orden descendente, y sólo aquellos menores del código postal introducido. Con esta select tenemos en orden descendente todos los códigos postales, y si de esta select cogemos los dos primeros (rownum < 3) ya tenemos los dos anteriores. El por qué se hace de este modo y no con esta select:
select cp from cod_postal
where cp < CP_INTRODUCIDO
and rownum < 3
order by cp desc
Es porque primero se cogen los registros que nos interesan en la cláusula where (cp < cp_introducido y sólo los dos primeros registros) y luego se ordenan, por ese motivo hay que hacer dos sub-selects...
La misma explicación sirve para coger los dos códigos postales posteriores.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas