Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   función snvl de fbUdf (https://www.clubdelphi.com/foros/showthread.php?t=5328)

Kafu 18-11-2003 09:31:13

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.

rastafarey 25-11-2003 21:52:05

No se que hace esa funcion

explicame por favor y te ayudare al instante

orodriguezc 26-11-2003 02:11:56

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.

Kafu 26-11-2003 09:36:19

Muchísimas gracias, funciona perfectamente. Me va a resolver bastantes problemas.
Un saludo,
F.T.G.

Kafu 26-11-2003 09:52:45

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.

guillotmarc 26-11-2003 10:35:38

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.

jachguate 26-11-2003 14:24:00

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.

;)

Cura 04-09-2007 03:48:46

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

Kafu 04-09-2007 08:36:15

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.

Paoti 04-09-2007 16:37:44

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


La franja horaria es GMT +2. Ahora son las 16:38:14.

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