Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   if "0" then null, como? (https://www.clubdelphi.com/foros/showthread.php?t=20210)

ELINK 08-04-2005 16:41:10

if "0" then null, como?
 
Debo de aceptar que soy un novato en esto del SQL y debido ha eso biene mi pregunta:
como puedo hacer para que en una consulta sql en vez de "0" aparesca null( o sea cambiado por null) :confused: :confused: :confused:

original:
codi_prod seri1 seri2 seri3 seri4 total
coecmsm 0 1 0 0 1

ideal:
codi_prod seri1 seri2 seri3 seri4 total
coecmsm 1 1

(no es necesario que sume) :D

droguerman 08-04-2005 23:10:20

si usas SQL Server puedes usar ISNULL

select ISNULL( campo, 0) FROM Tabla

ELINK 08-04-2005 23:35:56

y para FireBird 1.5?

Lo que quiero es: un valor "0" volverlo null ;)

fly 09-04-2005 06:24:24

Puedes crear una funcion que te convierta los 0 a NULL, haces una libreria con ella y la pones en las UDF del firebird y despues haces la cunsulta usando esa función.

Algo asín :

SELECT Cero2Null(seri1) AS seri1, Cero2Null(seri2) AS seri2 FROM Tabla_Seri WHERE...

va de maravilla, yo lo uso (con otra función claro está) y es la caña.

Saludos

ELINK 09-04-2005 17:11:58

mmm....
 
"Siento" que lo dices es correcto :p
Pero la verdad es que no se como realizar todo lo que me escribiste; exactamente desde el comienzo hasta "Algo asín :" luego para adelante no tengo problema, luego me puse a revisar la udf de firebird pero no entendi ni un poquito :confused: :confused:
Realmente te agradesería si me ayudaras a crear esa funcion ;)

Crandel 09-04-2005 21:52:15

proba con algo asi:

Código:

CREATE PROCEDURE Cero2Null (VALOR INTEGER) RETURNS (VALOR INTEGER)
AS
BEGIN
  IF (VALOR = 0) THEN VALOR = NULL;
END^

no es UDF, nunca cree uno, pero creo que te deberia funcionar igual con procedimiento.
Eso si, tambien es mas lento.

Delfino 09-04-2005 23:01:36

Has mirado las nuevas funciones del Estandar SQL NullIf, Case, Coalesce? mira los Release Notes y lo entenderas..

fly 11-04-2005 01:21:31

Un gallifante para Delfino ;) eso nos pasa por no leer... muy bien maestro...

Aunque ya no viene al caso te cuento lo de las UDF.

Es algo parecido a lo que dice Crandel pero más cómodo para ser usado en todas las aplicaciones:

1º.- Creas una libreria en delphi (en este caso intbase_star.dll)

Código:

library intbase_star;
 
{Esta libreria ha sido pensada para el trabajo con Interbase
para cubrir las carencias de funciones no implementadas directamente
en el motor de base de datos Interbase de Borland
 
las funciones deben crearse con paso de parametros cdecl
los parametros word o integer deben pasarse por referencia y los devuelve por valor
los parametros de tipo string dben pasarse por valor y se devuelven por valor
En interbase el tipo string debe ser pasado a Pchar con Cstring y en
las funciones de la DLL deben ser tratados como Pchar
}
 
uses
SysUtils,
Classes;
var buffer:  Pchar;
 
 
function redondeo(var dato:double;var digitos:integer):double; cdecl;
var dato_tratado:double;
        aux,contador:integer;
Begin
aux:=1;
for contador:=1 to digitos do aux:=aux*10;
dato_tratado:=dato;
dato_tratado:=dato_tratado*aux;
dato_tratado:=round(dato_tratado);
dato_tratado:=dato_tratado/aux;
redondeo:=dato_tratado
end;
 
 
function codext(txt: string; var dato: integer; var year:integer;var longdato:integer):Pchar;cdecl;
var cadena_S:string;
        contador:integer;
        Cadena_P:pchar;
        periodo : string;
        letra : char;
Begin
periodo:=IntToStr(year);
delete(periodo,1,2);
letra:=txt[1];
Cadena_P:=buffer;
Cadena_S:=inttostr(dato);
for contador:=length(Cadena_S) to longdato-1 do Cadena_S:='0'+Cadena_S;
Cadena_S:=UPPERCASE(letra)+'/'+periodo+Cadena_S;
strpcopy(Cadena_P,Cadena_S);
result:=cadena_P;
end;
 
exports
redondeo;
exports
codext;
begin
buffer:=stralloc(50);
end.

2º.- Pones la DLL creada en la carpera UDF del firebird/Interbase

3.- En el SQL de creación de la DB añades al principio:
Código:

DECLARE EXTERNAL FUNCTION codext
CSTRING(1),INTEGER, INTEGER,INTEGER
RETURNS CSTRING(10)
ENTRY_POINT "codext"
MODULE_NAME "INTBASE_star.DLL";

4.- Y ya está listo, puedes usar la función desde los triggers o desde delphi sin problemas.

Espero que este ejemplo te sirva para entenderlo, a mi me lo pasaron tal cual e hice las modificaciones necesarias para mi prog. (Fon gracias por el codigo)

jjorell 14-07-2006 18:06:52

Hola! la verdad no se mucho de FireBird, pero si algo sobre SQL Server y tambien pudiste hacerlo en una sola consulta utilizarando un CASE (si FireBird 1.5 lo soporta, que pensaría que si) , es decir algo asi:

Código SQL [-]
SELECT CASE seri1 WHEN 0 THEN NULL ELSE seri1 END AS seri1, 
       CASE seri2 WHEN 0 THEN NULL ELSE seri1 END AS seri2 
FROM Tabla_Seri WHERE ...


La franja horaria es GMT +2. Ahora son las 14:34:50.

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