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 26-06-2012
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
Coalesce en índice de firebird

Hola a todos, hace un tiempo leí en un hilo de este mismo foro, la forma de crear un índice con Coalesce para mejorar el desempeño de las consultas, pero desafortunadamente no lo encuentro, basicamente lo que necesito es que al hacer una consulta del tipo:

Código SQL [-]
Select
  T.A,T.B,T.C FROM TABLA T
WHERE
  A = COALESCE(:A, T.A)
  AND B = COALESCE(:B, T.B)
  AND C = COALESCE(:C, T.C)

Muchas gracias de antemano.
__________________
mas confundido que Garavito el día del Niño.

Última edición por mightydragonlor fecha: 26-06-2012 a las 03:42:09. Razón: Mea culpa.
Responder Con Cita
  #2  
Antiguo 26-06-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
COALENCE no es para mejorar el desempeño de la consulta. COALENCE es un operador seguro para evaluar Nulos. Lee: http://www.firebirdsql.org/refdocs/l...-coalesce.html

Entonces, COALENCE podría decirse que funciona así:
COALANCE(Value, Value2, Value3) equivaldrá a:
Código SQL [-]
IF (Value is not NULL) then result := Value
elseif (Value2 is not NULL) then result := Value2
elseif (Value3 is not NULL) then result := value3
...

COALENCE devolverá el primer parámetro que no sea NULL. Recuerda que, a excepción de "IS", no puedes utilizar los operadores para hacer comparaciones con NULL. Ya que el valor de NULL no está definido según el estándar SQL.

Saludos.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #3  
Antiguo 26-06-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.257
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Sólo recordar que es 'coalesce', no coalence.
Responder Con Cita
  #4  
Antiguo 26-06-2012
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
Cita:
Empezado por Chris Ver Mensaje
COALENCE no es para mejorar el desempeño de la consulta. COALENCE es un operador seguro para evaluar Nulos. Lee: http://www.firebirdsql.org/refdocs/l...-coalesce.html

Entonces, COALENCE podría decirse que funciona así:
COALANCE(Value, Value2, Value3) equivaldrá a:
Código SQL [-]
IF (Value is not NULL) then result := Value
elseif (Value2 is not NULL) then result := Value2
elseif (Value3 is not NULL) then result := value3
...

COALENCE devolverá el primer parámetro que no sea NULL. Recuerda que, a excepción de "IS", no puedes utilizar los operadores para hacer comparaciones con NULL. Ya que el valor de NULL no está definido según el estándar SQL.

Saludos.
Gracias por tu comentario Chris, conozco perfectamente como funciona Coalesce, pero hay un problema, en consultas con muchos parámetros, las cuales deben hacerse en tablas con una gran cantidad de datos empieza a generar Tables Scan, hace algún tiempo leí que puedes crear un índice a una tabla que puede hacer que cuando uses el Coalesce no haga el Table Scan y use ese índice optimizado para el Coalesce.
Muchas gracias, Saludos.
__________________
mas confundido que Garavito el día del Niño.
Responder Con Cita
  #5  
Antiguo 26-06-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Sinceramente nunca había escuchado sobre este asunto. Es interesante todo esto que estás diciendo.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 26-06-2012
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.

Puedes utilizar un Expression Index (Índice sobre expresión). Mira la documentación sobre CREATE INDEX.

http://www.firebirdsql.org/refdocs/l...ate-index.html

Aunque no va a funcionar para el ejemplo concreto que has dado, puesto que tu expresión tiene parámetros, y por tanto no es posible evaluarla en el momento de insertar un registro (cuando se crea una entrada en el índice). Solo se puede evaluar en el momento de lanzar la consulta con unos parámetros concretos.

Es decir :

Esta expresión se puede optimizar mediante un índice.

create index ix_T on T computed by (coalesce(A, ''));

Pero esta expresión no se puede optimizar (no puedes indicar parámetros que solo existen en tiempo de lanzar la consulta).

create index ix_T on T computed by (coalesce(:A, A));

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 26-06-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Yo creo que talvez a lo que te refieres es a esto:
http://weblogs.sqlteam.com/jeffs/arc...e-clauses.aspx
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #8  
Antiguo 26-06-2012
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
Gracias guillotmarc y Chris por sus respuestas, la verdad es que ambas me han servido mucho, muchísimas gracias =)
__________________
mas confundido que Garavito el día del Niño.
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
SQL CASE y COALESCE mjjj SQL 1 17-12-2008 17:37:52
Error al Crear INDICE... FIREBIRD/INTERBASE Rogersito Plus Firebird e Interbase 6 04-01-2008 02:02:29
Duda sobre COALESCE AGAG4 Firebird e Interbase 4 28-04-2006 22:00:57
Algo sobre COALESCE jwmoreira Firebird e Interbase 1 08-03-2005 21:23:20
Indice Secundario en Firebird barrauda Conexión con bases de datos 4 01-02-2004 14:38:32


La franja horaria es GMT +2. Ahora son las 00:51:52.


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