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 18-11-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 22
Kafu Va por buen camino
función snvl de fbUdf

Hola Foro,

Tengo un query que une dos tablas con un left join y cuyo resultado puede darme nulos en un campo de la selección, caso en el que quiero que devuelva un valor fijo, una cadena para ser más exacto.
Pensaba que la función snvl iba a sustituir nulos por lo que yo quisiera, pero me da un espacio en blanco. No sé si alguien la habrá usado o si hay otra función más adecuada, en cualquiera de los dos casos agradecería su ayuda.

Es algo así:

Select a.campo1, snvl(b.campo2, 'cadena') from a left join b on a.tal = b.cual

Donde espero tener "cadena" en las filas en las que el join no encuentre su registro en la tabla b. He probado también snullif y el resultado es el mismo.

Un saludo,

F.T.G.
Responder Con Cita
  #2  
Antiguo 25-11-2003
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
No se que hace esa funcion

explicame por favor y te ayudare al instante
Responder Con Cita
  #3  
Antiguo 26-11-2003
orodriguezc orodriguezc is offline
Miembro
 
Registrado: nov 2003
Ubicación: Cartagena - Colombia
Posts: 33
Poder: 0
orodriguezc Va por buen camino
Puedes utilizar un CASE para convertir el resultado del Select, por lo meno en FireBird 1.5 funciona bien. Siguiendo tu ejemplo:


Select a.campo1,
CASE WHEN b.campo2 is null then 'cadena'
ELSE b.campo2 end as MICAMPO
from a left join b on a.tal = b.cual

Espero te sirva.
Responder Con Cita
  #4  
Antiguo 26-11-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 22
Kafu Va por buen camino
Muchísimas gracias, funciona perfectamente. Me va a resolver bastantes problemas.
Un saludo,
F.T.G.
Responder Con Cita
  #5  
Antiguo 26-11-2003
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 22
Kafu Va por buen camino
Rastafarey dijo:
Cita:
No se que hace esa funcion
No había visto tu post. En teoría la función debería sustituir nulos por la cadena especificada. El sentido es que al operar con nulos el resultado no sea nulo. Y funciona realmente salvo en un caso que hemos visto. Creo que expliqué mal mi problema.
Si yo hago
select nombre||snvl(apellido, 'asdfasdf'), me devolverá el nombre más la cadena cuando el apellido sea nulo, en lugar de un nulo.
Pero cuando se hace lo mismo en un left join, por ejemplo:

select snvl(n.nombre, 'sdfafasdaf') from direcciones d left join nombres n on d.idnombre = n.idnombre

No lo hace bien, devuelve cadena vacía en lugar de la especificada. Supongo que tiene que ver con el orden de evaluación, no lo sé. Bueno, un saludo.
F.T.G.
Responder Con Cita
  #6  
Antiguo 26-11-2003
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.

Aparte de resolver el problema con la construcción CASE, en Firebird 1.5 tienes la mayoría de las funciones de los principales motores para ese caso : ISNULL, COALESCE, NVL

O sea que puedes hacer perfectamente :

select NVL(Campo, 'Cadena')

NOTA : No lo he probado, pero está en la documentació de Firebird 1.5

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #7  
Antiguo 26-11-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

no dudo que la función funcione (valga la redundancia). Tal como comentó Kafu, tiene que ver con el orden de evaluación.

Si Firebird evalua la función antes de hacer el encuentro externo (left/right join), devolverá 'cadena' solamente para aquellas filas que tengan un valor nulo almacenado en la tabla, y al hacer el encuentro, seguirán apareciendo con nulo aquellas para las que no haya habido una fila correspondiente. Exactamente las que son la razon de ser del encuentro externo.

Por el contrario, si primero se realiza el join, y luego se evalua la función, está deberá sustituir por 'cadena' todas aquellas filas que contengan NULL en ese momento. Es decir, por igual aquellas para las que el valor sea NULL en la tabla base, como aquellas que tengan NULL porque no existe un registro en la tabla.

Espero haberme explicado... y que haya alguien que tenga Firebird y haga un par de pruebas, para saber de que manera funciona.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 04-09-2007
Avatar de Cura
Cura Cura is offline
Miembro
 
Registrado: oct 2005
Posts: 15
Poder: 0
Cura Va por buen camino
Hola, estuve probando esto y funciona bien con campos numericos
pero no logro que haga el reemplazo cuando el campo dentro de la funcion es cadena de caracteres, alguien me puede ayudar?
ta probe el snvl, nullif y coalesce y nada
Responder Con Cita
  #9  
Antiguo 04-09-2007
Kafu Kafu is offline
Miembro
 
Registrado: may 2003
Ubicación: Bilbao
Posts: 117
Poder: 22
Kafu Va por buen camino
Si mal no recuerdo (tengo firebird y delphi un poco olvidados) snvl era precísamente para aplicarse a cadenas. ¿Podrías especificar la sentencia sql que no funciona?
Un saludo,
F.T.G.
Responder Con Cita
  #10  
Antiguo 04-09-2007
Avatar de Paoti
Paoti Paoti is offline
Miembro
 
Registrado: may 2003
Ubicación: Monterrey. N.L., México
Posts: 612
Poder: 21
Paoti Va por buen camino
hola


desde firebird 1.5.x en adeñante me aprece ya viene integrada la función COALESCE


Ejemplo:

Código SQL [-]
SELECT NOMBRE, COALESCE(APELLIDOS, ''), COALESCE(EDAD, 0) FROM TABLA


coalesce devuelve el último valor si su antecesor viene nulo

su sintaxis es mas o menos así:


Código:
COALESCE(VALOR, VALOR2, VALOR3,...,VALORN)
si valor es nulo, devuelve valor1, si valor1 es nulo tambien devuelve valor2, etc etc hasta valorN
__________________
Estudia y anda en la calle.... que asi serás el doble de listo que los demás...

análisis de información
análisis y diseño de sistemas

Paoti Rios Reséndiz
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


La franja horaria es GMT +2. Ahora son las 04:16:19.


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