FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Poner 0 cuando el resultado en null
Hola a todos, tengo una consulta que me devuelve algunos campos numéricos, pero en algunos casos los campos numéricos estan nulos, y en ese caso, quiero que el resultado sea 0, y no Null.
Es posible? Desde ya, muchas gracias |
#2
|
||||
|
||||
desde donde, desde delphi, desde isql, desde un stored procedure, desde donde????
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#3
|
|||
|
|||
De la consulta SQL, pongo un ejemplo:
select monto from tabla: en este caso, si el campo monto esta nulo, el SQL devuelve <null>, y lo que yo quiero es que me devuelva 0. No me acuerdo como se llama la función, pero en ORACLE existe una función que te hace esto. Lo que quiero saber es si en Firebird se puede hacer algo similar. Una solución que tengo es asignarle 0 como valor por defecto del campo, pero si es posible no quiero modificar la tabla y solucionarlo en mi consulta. |
#4
|
||||
|
||||
En Oracle es NVL
En SqlServer es ISNULL En Access es NZ Desconozco en Interbase/Firebird, pero si no existe no creo que sea complicado crearla. Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#5
|
||||
|
||||
En interbase hasta la versión 6 no la hay.... quizas en la versión 7 o en firebird 1.5....
como extraño al Decode de oracle también.... De cualquier forma podes hacerte una pequeña dll que te de la funcionalidad.... hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#6
|
|||
|
|||
Puede ser que haya otras soluciones, pero una forma de hacerlo puede ser esta:
Primero defines la funcion externa DIV Código:
DECLARE EXTERNAL FUNCTION DIV INTEGER, INTEGER RETURNS DOUBLE PRECISION BY VALUE ENTRY_POINT 'IB_UDF_div' MODULE_NAME 'ib_udf'; Código:
Tabla de ejemplo CREATE TABLE "MONEDAS" ( "COD_MON" INTEGER NOT NULL, "CVN_MON" INTEGER ); para eso usas la función DIV (división sin resto) igualando el divisor a 1. Código:
select cod_mon, DIV(cvn_mon,1) from monedas; De ese modo tiene el nullo transformado a 0....... Recuerda es un apaño y solo funciona con enteros lo ideal seria tener una función externa para eso. Si quieres que funcione con 2 decimales puedes hacer algo por el estilo. por ejemplo si CVN_MON fuera NUMERIC(8,2) por ejemplo. usa esto: (DIV(cast ((cvn_mon * 100) as integer),1))/100 >>Recuerda comentar profusamente esta sentencia por si alguien viene detras de ti para que pueda entender el porque.... Última edición por chutipascal fecha: 21-06-2003 a las 13:59:41. |
#7
|
|||
|
|||
Muchas gracias a todos, al final he solucionado creando una dll.
|
#8
|
||||
|
||||
evidentemente la función div comentada por chutipascal tiene un bug... pues al operar sobre un null deviera devolver null??
al menos a mi me parece que debiera ser así...
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#9
|
|||
|
|||
Cita:
Select campo1, campo2 from tabla where not campo1 is null union select 0, campo2 from tabla where campo1 is null Un saludo, F.T.G. |
#10
|
|||
|
|||
Si evidentemente, se puede pensar de que es un bug o de que se trata de una 'caracteristica del sistema' por eso aconsejo de comentar profusamente una sentencia construida de esa forma, por cierto me gusta mucho la sentencia de kafu.
Un saludo. |
#11
|
|||
|
|||
Otra alternativa es tomar como política el no tener ningún campo integer o float en la BD con valor null.
Es decir, siempre que vamos a grabar podemos utilizar un procedimiento como este: Nullsazero(Ttable(dataset)); // =Nullsazero(Tproveedores); Procedure Nullsazero(Taula:Ttable); var i:smallint; begin For i:=0 to taula.FieldCount-1 do begin If ((Taula.Fields[i].Datatype=ftfloat) and (Taula.Fields[i].Isnull)) then Taula.Fields[i].AsFloat:=0; If (((Taula.Fields[i].Datatype=ftsmallint) or (Taula.Fields[i].Datatype=ftinteger)) and (Taula.Fields[i].Isnull)) then Taula.Fields[i].AsInteger:=0; end; end; Igual parece pesado cada vez tener que invocar al procedimiento, pero si tenemos la aplicación bien diseñada, podemos tener un "form base" de los que todos los otros heredan, y la invocación a NullsAZero solo la hará éste form base, y no lo tendremos que incluir en todos los forms que vamos creando. Saludos! |
#12
|
|||
|
|||
Cita:
De todas formas el (null) es necesario en algunos casos, tiene el significado de que no hay dato para ese campo cosa muy distinta a que tenga un cero. Un saludo. Última edición por chutipascal fecha: 26-06-2003 a las 11:52:56. |
#13
|
||||
|
||||
Es un hecho que en ocasiones los campos a null son necesarios. De hecho, por eso existe la posibilidad de poner los campos a null, y yo creo personalmente que es una deficiencia de Interbase no contar con una función al estilo de la nvl() de oracle.
Sin embargo, también es fácil hacer una dll que cubra esa función. Lo que no es bueno es que no hay una estándarización para la forma de hacerlo, y eso al final de cuentas, impide que la comunidad de firebird se vuelva más sólida. Lo digo porque regularmente si queres integrar a alguna persona a tu equipo de desarrollo, no basta con que sepa firebird... sino que tiene que aprender la forma de hacer una y mil cosas. Además cuando vos te vas a integrar a otro equipo de desarrollo, o tenes que agarrar una aplicación ya desarrollada en interbase, es una cantidad de cosas que aprender que elevan los tiempos y los costos... en fín... ese ya es tema de un debate y no de esta conversación. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#14
|
||||
|
||||
Hola,
Cita:
Toma el ejemplo de las normas estándar para el SQL, casi todas las compañías dicen cumplirlas y seguir alguno de los estándares: SQL-92, SQL-99, ..., pero en general sólo lo hacen al nivel básico (entry-level) y muy parcialmiente a nivel medio y avanzado. Y esto es común en todos los productos, incluidos los más conocidos: Oracle, MS-SQL Server, InterBase ... La cuestión es que empresas como Oracle o Microsoft pueden desviarse del estándar y crear un estándar (no-oficial) de facto, debido a la gran penetración que tienen en el mercado, cosa que es prácticamente imposible para productos como InterBase. Otra cuestión es aceptar un estándar propietario sobre otro elaborado por un organismo independiente (y no todos los organimos que se dicen independientes lo son). Saludos Última edición por kinobi fecha: 26-06-2003 a las 13:02:36. |
#15
|
|||
|
|||
Y ademas en la variedad esta el gusto, personalmente no me alegraria de tener un panorama como la china de mao (todos vestidos con el mismo uniforme), el que las prestaciones y otras cosas sean distintas te permite.... elegir
Un saludo. |
#16
|
||||
|
||||
Por supuesto... estoy totalmente de acuerdo entre ustedes...
Cuando me referia al problema de la falta de "estandarización" me referia a que existiera una función estándar dentro de interbase, por ejemplo, para convertir un valor nulo en uno arbitrario, que siempre se presenta el caso: les doy un ejemplo. En oracle yo puedo hacer algo como: Código:
Select nvl(Nombre, 'Sin Nombre') from clientes; o Select nvl(saldo, 0) from saldo; y cualquier persona que conozca oracle entenderá mis query's, sabrá exactamente lo que quise hacer y podrá modificarlos, lo que no ocurre con interbase, al menos en una función tan Vital. Además, le agrega un poder por defecto a la base de datos....
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#17
|
||||
|
||||
Hola,
Cita:
En resumen, o el estándar está mal especificado (operando NULL --> expresión NULL) o el uso de funciones tipo nvl de Oracle no puede formar parte del estándar, ya que es un atajo para saltarse la norma. Advierte que no estoy cuestionando la necesidad ni la utilidad de la función, sino si ésta debe ser implantanda, de forma estándar, en todo motor relacional. Saludos Última edición por kinobi fecha: 26-06-2003 a las 14:48:49. |
#18
|
||||
|
||||
Hola.
Cita:
Sin embargo, creo que lo que hace fuertes también a las bases de datos no solo es su apego a las normas estándares, sino las prestaciones adicionales que pueden ofrecerte. Quizás he empleado mal el término... y no quiero discutir con Kinobi acerca de estándares, ya que nunca los he leido..... así que fácilmente metere la pata. Pero en mi escritorio, cuando estoy programando, agradezco ciertos "atajos" que al final de cuentas me hacen mas fácil la vida y me vuelven mas productivo. Es una apreciación personal. Hasta luego.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#19
|
||||
|
||||
Hola,
Cita:
Cita:
Saludos |
#20
|
|||
|
|||
Hola,
Siguiendo el tema, me parece que a lo que se refiere jachguate, es que sería bueno que dentro de Interbase haya un "estandar" para realizar esta conversión y no tener que cada desarrollador implementear una solución particular. Sin necesidad de que esa solución sea el estandar de ANSI, se entiende?. Asi como SQL Server tiene el ISNULL u Oracle el NVL, Interbase deberia tener "algo". Es simplemente una apreciación al seguir el hilo. Saludos. Ariel. |
|
|
|