Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 08-10-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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).
Responder Con Cita
  #3  
Antiguo 08-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
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
Responder Con Cita
  #4  
Antiguo 08-10-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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).
Responder Con Cita
  #5  
Antiguo 08-10-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
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).
Responder Con Cita
  #6  
Antiguo 08-10-2010
Avatar de mightydragonlor
[mightydragonlor] mightydragonlor is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Medellín-Colombia
Posts: 587
Poder: 18
mightydragonlor Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 08-10-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

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:
Código SQL [-]
select Campo1 from Tabla
order by Abs(Campo1 - 5);
Particularmente la he probado en MySQL y he obtenido el siguiente resultado:
Cita:
Campo1
5
4
6
3
7
2
8
1
9
10
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #8  
Antiguo 09-10-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Cita:
Empezado por rgstuamigo Ver Mensaje
Particularmente la he probado en MySQL y he obtenido el siguiente resultado:
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).
Responder Con Cita
  #9  
Antiguo 09-10-2010
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

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
Responder Con Cita
  #10  
Antiguo 09-10-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por guillotmarc Ver Mensaje
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.
Efectivamente, en firebird 1.5 no funciona, pero lo he probado en firebird 2.1 y sí funciona.
Responder Con Cita
  #11  
Antiguo 11-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
muchas gracias a todos por la colaboracion. Probare a migrar a FB2.1.
__________________
Saludos,

Bitman
Responder Con Cita
  #12  
Antiguo 12-10-2010
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 24
guillotmarc Va por buen camino
Cita:
Empezado por Toni Ver Mensaje
muchas gracias a todos por la colaboracion. Probare a migrar a FB2.1.
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).
Responder Con Cita
  #13  
Antiguo 28-10-2010
Toni Toni is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona - España
Posts: 364
Poder: 22
Toni Va por buen camino
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
Cuando tenga ocasion de migrar a FB2.5 mirare de utilizar una expresion mas elegante, pero por el momento va a las mil maravillas.

Mil gracias.

Saludos,
__________________
Saludos,

Bitman
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
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


La franja horaria es GMT +2. Ahora son las 16:53:45.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi