![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Buscar valores mas cercanos
Hola compañeros,
Tengo la necesidad de buscar en una tabla (firebird) por un campo que es numerico y tengo que buscar en un momento determinado los valores mas 'proximos'. Por proximos quiero decir los valores que se hacercan mas a un valor, tanto por delante como por detras. Ejemplo: Si tengo una tabla con el campo1 de tipo integer y con estos datos. Campo1 ------- 1 2 3 4 5 6 7 8 9 10 Como podria buscar o obtener la tabla ordenada por el criterio de proximidad a un valor, por ejemplo del 5: Campo1 -------- 4 6 7 3 8 2 9 1 10 En otros servidores SQL me permite realizar una consulta donde la clausula order by puedo poner una expresion con un calculo y esto permite obtener el resultado deseado: select Campo1 from Tabla order by abs(Campo1 - :Valor) Lo que no se como realizar esto en firebird. Saludos,
__________________
Saludos, Bitman |
#2
|
||||
|
||||
Hola.
¿ Porqué no utilizas esto ? : select Campo1, abs(Campo1 - :Valor) from Tabla order by 2 Naturalmente en tu programa Delphi tendrás que ocultar la segunda columna y solo mostrar la primera. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#3
|
|||
|
|||
Hola Guillotmarc,
Pues no habia caido en esa posibilidad de utilizar el order by por numero de columna y poner la expresion en la select. Lo estoy probando y me da un error que no me permite utilizar la funcion abs(), yo diria que la he utilizado en otras ocasiones. Lo estoy probando con FB1.5 y el EMS IB Manager 3. Me da la impresion que es el gestor EMS que no le gusta la funcion y no el propio FB1.5
__________________
Saludos, Bitman |
#4
|
||||
|
||||
Hola.
Lo he mirado y parece que no es una función interna, sino que está en la UDF ib_udf.dll Prueba declarándola, ejecutando primero (solo hay que hacerlo una vez) : DECLARE EXTERNAL FUNCTION abs DOUBLE PRECISION RETURNS DOUBLE PRECISION BY VALUE ENTRY_POINT 'IB_UDF_abs' MODULE_NAME 'ib_udf'; NOTA : Esta declaración es para FB 2.0, espero que no haya cambiado para FB 1.5.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#5
|
||||
|
||||
Claro que siempre puedes hacer esta consulta.
select Campo1, case when (Campo1 - :Valor) > 0 then Campo1 - :Valor else -1 * (Campo1 - :Valor) end from Tabla order by 2 Pero la verdad es que es muy feo.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#6
|
||||
|
||||
y no es mejor usar un Between?, lo digo por que es lo que uso en MSSQL, en firebird no sé si está.
__________________
mas confundido que Garavito el día del Niño. |
#7
|
||||
|
||||
![]() Pues no entiendo por que complicarse tanto, ya que el amigo Toni, él mismo a dado la solucion a su problema
![]() Personalmente no trabajo con Firebird, pero segun tengo entendido, ya es un servidor bien madurito, por tanto creo que tranquilamente se puede hacer ésta consulta SQL: Particularmente la he probado en MySQL y he obtenido el siguiente resultado: Cita:
![]()
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7 |
#8
|
||||
|
||||
En Firebird 1.5, que es el servidor utilizado por Toni, esta consulta no es aceptada. En versiones superiores de Firebird sí que se ha implementado la posibilidad de utilizar expresiones en la cláusula ORDER BY.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#9
|
||||
|
||||
![]() Ah Caray... entonces quizás nuestro buen amigo Toni debería actualizarse a la última version de Firebird, que segun tengo entendido es la version 2.5
![]() Por demás queda decir que Firebird es "gratis", por lo tanto en lo posible hay que trabajar con las últimas versiones. ![]() Saludos... ![]()
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7 |
#10
|
||||
|
||||
Efectivamente, en firebird 1.5 no funciona, pero lo he probado en firebird 2.1 y sí funciona.
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
#11
|
|||
|
|||
muchas gracias a todos por la colaboracion. Probare a migrar a FB2.1.
__________________
Saludos, Bitman |
#12
|
||||
|
||||
Si vas a migrar, ya puedes hacerlo directamente a FB 2.5, que hace pocas semanas ya fue liberado como versión final.
Aunque prepárate para revisar todo tu proyecto, ya que muchas consultas que en FB 1.5 te funcionaban pueden necesitar que las reescribas (por ejemplo, por campos sin especificar su tabla, etc. ... ya que FB 2.x es más estricto con seguir el estándar SQL). NOTA: para hacer el cambio de una base de datos a otra, tienes que hacer un backup de tus bases de datos en FB 1.5, desinstalarlo e instalar FB 2.5, y posteriormente restaurar tus copias de seguridad. Aunque si tienes dos ordenadores disponibles, casi que te recomiendo que instales FB 2.5 en el segundo ordenador, y restaures allí tus copias de seguridad. De esa forma podrás trabajar a la vez con FB 1.5 y FB 2.5. Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no). |
#13
|
|||
|
|||
Muchas gracias Guillotmarc, finalmente he podido probar en real la solucion que me propusistes y me funciona correctamente.
Código:
select Campo1, case when (Campo1 - :Valor) > 0 then Campo1 - :Valor else -1 * (Campo1 - :Valor) end from Tabla order by 2 Mil gracias. Saludos,
__________________
Saludos, Bitman |
![]() |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Buscar Valores en una Grillla | peripla | Varios | 4 | 23-03-2009 19:44:31 |
Valores OldValue | RicardoNavarro | Firebird e Interbase | 1 | 26-04-2007 17:57:54 |
regresar valores | Genner | MS SQL Server | 5 | 03-04-2006 13:55:43 |
Valores (Predeterminado) | vichovi | API de Windows | 3 | 04-01-2005 09:40:02 |
Redondeo de valores | JODELSA | Varios | 1 | 23-08-2003 18:33:50 |
![]() |
|