FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
No se que hace esa funcion
explicame por favor y te ayudare al instante |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
Muchísimas gracias, funciona perfectamente. Me va a resolver bastantes problemas.
Un saludo, F.T.G. |
#5
|
|||
|
|||
Rastafarey dijo:
Cita:
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. |
#6
|
||||
|
||||
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). |
#7
|
||||
|
||||
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 |
#8
|
||||
|
||||
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 |
#9
|
|||
|
|||
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. |
#10
|
||||
|
||||
hola
desde firebird 1.5.x en adeñante me aprece ya viene integrada la función COALESCE Ejemplo:
coalesce devuelve el último valor si su antecesor viene nulo su sintaxis es mas o menos así: Código:
COALESCE(VALOR, VALOR2, VALOR3,...,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 |
|
|
|