Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Reemplazar null por cero en select

Estas en el tema de Reemplazar null por cero en select en el foro de PostgreSQL en Foros del Web. Tengo este query: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código sql: Ver original SELECT DISTINCT c2 . alias FROM ( SELECT t . fecha fec , COUNT ( COALESCE ...
  #1 (permalink)  
Antiguo 06/10/2009, 01:16
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Reemplazar null por cero en select

Tengo este query:

Código sql:
Ver original
  1. SELECT DISTINCT c2.alias FROM
  2. (SELECT t.fecha fec, COUNT(COALESCE(t.campo,0)) alias FROM tabla t WHERE t.fecha BETWEEN '25-08-2009' AND '05-10-2009' GROUP BY t.fecha ) c2 ORDER BY c2.fec;

Este query devuelve dos filas de mi BD, pero pone los resultados del COUNT de la primera fila, en la segunda. Los de las segunda son nulos... implementé COALESCE para reemplazar resultados null por cero, pero sigue reemplazando con los valores de la primera fila...
(Es como si repitiera resultados para la segunda fila)

ayuda!!!
  #2 (permalink)  
Antiguo 06/10/2009, 07:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Reemplazar null por cero en select

Cita:
COALESCE para reemplazar resultados null por cero, pero sigue reemplazando con los valores de la primera fila...
efectivamente colaesce es utilizada para reemplazar valores numeros por cadenas o numeros diferentes.
Pero no logro entender bien cual es tu problema.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 06/10/2009, 08:04
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Reemplazar null por cero en select

Si, es complicado de explicar, pero ahora entendí bien el problema:

El resultado del query que tengo me arroja dos registros según una fecha, esos registros constan de varios campos, para el primer registro todos los valores son correctos, pero para el segundo registro no, pues "no existe" registro ahí en algunos campos, por lo tanto debería arrojar valores "null" o en este caso con la función coalesce arrojar valores "0", pero la función sólo se aplica cuando existe un registro y uno de sus "campos" es "null", por lo cual estoy buscando una forma de implementar un Distinct Left o Right (aún no sé bien como trabajan) para que Coalesce pueda funcionar bien y encontrar registros pero con campos vacíos, pues cuando Coalesce no encuentra nada, en este caso reemplaza con el último valor encontrado (los del primer registro).

Cómo puedo solucionar esto? Con distinct?

2009-10-04 00:00:00|;12|;8|;8|;2000
2009-10-05 00:00:00|;8 |;8|;8|;2000 ---> El segundo 8 y 2000 no deben ir, eso es NULL (Repite los anteriores)

Última edición por ssh; 06/10/2009 a las 08:46
  #4 (permalink)  
Antiguo 06/10/2009, 13:29
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Reemplazar null por cero en select

Existe en postgres una función que (ojo) cuando no exista un registro, ponga un "0"?
Para eso no sirve COALESCE... pues este discrimina sólo si existe el registro con campo "null"...

Podría usar un HAVING?????????
  #5 (permalink)  
Antiguo 06/10/2009, 15:05
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Reemplazar null por cero en select

ssh... No te refieres a un null sino a un vacío?
null es diferente de vacío pero me confunde el hecho de que digas que muestre cuando no haya registros. Te refieres a que haya un vacío?

Mira estos ejemplos
Código sql:
Ver original
  1. pruebas=> \d prueba_null;
  2.            Tabla ½public.prueba_null╗
  3.  Columna |         Tipo          | Modificadores
  4. ---------+-----------------------+---------------
  5.  campo1  | CHARACTER VARYING(10) |
  6.  
  7. pruebas=> INSERT INTO prueba_null VALUES('');
  8. INSERT 0 1
  9. pruebas=> INSERT INTO prueba_null VALUES(NULL);
  10. INSERT 0 1
  11. pruebas=> INSERT INTO prueba_null VALUES('otra cosa');
  12. INSERT 0 1
  13. pruebas=> SELECT *FROM prueba_null;
  14.   campo1
  15. -----------
  16.  
  17.  
  18.  otra cosa
  19. (3 filas)

Al parecer null y vacío son iguales. (Visualmente) pero mira esto:

Código sql:
Ver original
  1. pruebas=> SELECT COALESCE(campo1,'nulos') FROM prueba_null;
  2.  COALESCE
  3. -----------
  4.  
  5.  nulos
  6.  otra cosa
  7. (3 filas)
  8.  
  9. pruebas=> SELECT CASE WHEN campo1='' THEN 'vacios' ELSE campo1 END FROM prueba_null;
  10.   campo1
  11. -----------
  12.  vacios
  13.  
  14.  otra cosa
  15. (3 filas)
  16.  
  17. pruebas=> SELECT CASE WHEN campo1='' THEN 'vacio' ELSE COALESCE(campo1,'nulos') END FROM prueba_null
  18. ;
  19.  COALESCE
  20. -----------
  21.  vacio
  22.  nulos
  23.  otra cosa
  24. (3 filas)

aplica este concepto a tu problema.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 06/10/2009 a las 15:12
  #6 (permalink)  
Antiguo 08/10/2009, 16:29
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Reemplazar null por cero en select

Haber, paso a explicar más detalladamente el problema:
Código sql:
Ver original
  1. Tabla: public.tabla1
  2.  Columna |         Tipo          | Modificadores
  3. ---------+-----------------------+---------------
  4.  fecha1  | TIMESTAMP             |
  5.  campo1  | INT                   | (PRIMARY KEY)
  6.  
  7.            Tabla: public.tabla2
  8.  Columna |         Tipo          | Modificadores
  9. ---------+-----------------------+---------------
  10.  fecha2  | TIMESTAMP             |
  11.  campo2  | INT                   | (FOREIGN KEY --> tabla1.campo1)
  12. contador | INT                   |
  13.  
  14.            Tabla: public.tabla3
  15.  Columna |         Tipo          | Modificadores
  16. ---------+-----------------------+---------------
  17.  fecha3  | TIMESTAMP             | (PK)
  18.  campo3  | INT                   | (FOREIGN KEY --> tabla1.campo1) / (PK)
  19.  
  20.            Tabla: public.tabla4
  21.  Columna |         Tipo          | Modificadores
  22. ---------+-----------------------+---------------
  23.  fecha4  | TIMESTAMP             | (PK)
  24.  campo4  | INT                   | (FOREIGN KEY --> tabla1.campo1) / (PK)
  25.  
  26.            Tabla: public.tabla5
  27.  Columna |         Tipo          | Modificadores
  28. ---------+-----------------------+---------------
  29.  fecha5  | TIMESTAMP             |
  30.  campo5  | INT                   | (FOREIGN KEY --> tabla1.campo1)
  31.  otro    |

Qué necesito de estas tablas?

Fecha | COUNT(campo2) | COUNT(campo3) | COUNT(campo4) | SUM(campo5)

Utilizo dos fechas para buscar en un periodo. Cómo lo intento resolver?

Código sql:
Ver original
  1. SELECT DISTINCT c2.fec2, c2.camp2, c3.camp3, c4.camp4, c5.camp5 FROM
  2. (SELECT DISTINCT t1.campo1 camp1 FROM public.tabla1 t1 ORDER BY ct.recno) c1,
  3. (SELECT t2.fecha fec2, COUNT(COALESCE(t2.campo2,0)) camp2 FROM public.tabla2 t2 NATURAL INNER JOIN public.tabla1 t1 WHERE t2.fecha BETWEEN '25-08-2009' AND '06-10-2009' GROUP BY t2.fecha ) c2,
  4. (SELECT t3.fecha fec3, COUNT(COALESCE(t3.campo3,0)) camp3 FROM public.tabla3 t3 NATURAL INNER JOIN public.tabla1 t1 WHERE t3.fecha BETWEEN '25-08-2009' AND '06-10-2009' GROUP BY t3.fecha) c3,
  5. (SELECT t4.fecha fec4, COUNT(COALESCE(t4.campo3,0)) camp4 FROM public.tabla4 t4 WHERE t4.fecha BETWEEN '25-08-2009' AND '06-10-2009' GROUP BY t4.fecha) c4,
  6. (SELECT t5.fecha fec5, COALESCE(SUM(t5.campo3), 0)  camp5 FROM public.tabla5 t5 WHERE t5.fecha BETWEEN '25-08-2009' AND '06-10-2009' GROUP BY t5.fecha) c5,
  7. public.tabla2 t2, public.tabla3 t3
  8.       WHERE t2.campo2 = c1.camp1 AND
  9.         t3.campo3 = c1.camp1    
  10.         ORDER BY c2.fec2;

Entrega como resultado:
Código sql:
Ver original
  1. fec2      camp2     camp3     camp4     camp5
  2. ----------------------------------------------------
  3. 04-10-2009    12        8         8          200
  4. 05-10-2009    8         8         8          200 --> Repite el último valor  
  5. 06-10-2009    6         8         8          200 --> Repite el último valor

En el lugar en donde repite el último valor, en realidad no existía registro, pero postgres igual pone el valor anterior, ese es el valor en donde quiero poner un "0" o nada, o algo, me entiendes?
  #7 (permalink)  
Antiguo 09/10/2009, 15:53
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Reemplazar null por cero en select

Muy complicado el problema?
El error pasa porque los Sub-Select no tienen un nexo entre ellos, sólo comparten un periodo, yo quiero que cuando pregunte por una fecha que está en la tabla1 pero no en las demás, aparezca "0" en los contadores, ya que esos días, no hubo registros en las tablas que no son la 1.
  #8 (permalink)  
Antiguo 13/10/2009, 09:10
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Reemplazar null por cero en select

Una última consulta, cómo podría un query devolver "alguna" señal cuando lo que estoy pidiendo no exisxte? Es decir:

Si consulto a la tabla fecha en donde sólo tengo fechas y esa que busco no existe, que me devuelva algo.. una cadena... alguna señal, un false.. y luego como podría validar eso?
  #9 (permalink)  
Antiguo 13/10/2009, 09:17
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Reemplazar null por cero en select

haz un select count(*) e ingresalo en una variable.
Si es cero, que devuelva un false, si es diferente de cero, que devuelva un true.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 13/10/2009, 10:16
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Reemplazar null por cero en select

puedes darme un ejemplo como implementar IF ELSE con esa variable que mencionas en un query SELECT?

sería algo como:

Código sql:
Ver original
  1. SELECT IF COUNT(campo) IS NULL THEN 0 ELSE COUNT(campo) FROM tabla WHERE fecha = '13-10-2009';

pero eso me arroja de nuevo "nada" necesito tener algo de retorno...
  #11 (permalink)  
Antiguo 13/10/2009, 10:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Reemplazar null por cero en select

algo así:

Código sql:
Ver original
  1. DECLARE contar record;
  2. BEGIN
  3. SELECT INTO contar COUNT(campo) AS conteo FROM tabla WHERE fecha = '13-10-2009';
  4. IF contar.conteo = 0 THEN
  5.    RETURN FALSE;
  6. ELSE
  7.    RETURN TRUE;
  8. END IF;

El select into, ingresa en la variable record el valor del conteo. Para accederlo, hay que llamarlo por el alias respectivo para que sepa a que campo hace referencia.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 14/10/2009, 08:00
ssh
 
Fecha de Ingreso: agosto-2009
Mensajes: 85
Antigüedad: 14 años, 7 meses
Puntos: 0
Respuesta: Reemplazar null por cero en select

Finalmente lo solucioné utilizando un contador que me retornara "0" si no cuenta nada (Lo cual significa que en la fecha seleccionada, no hay registro).

El código quedó así:

Código sql:
Ver original
  1. SELECT COUNT(campo) campo, CASE COUNT(campo)
  2. WHEN NULL THEN 0 ELSE COUNT(campo) END
  3. FROM tabla WHERE fecha = '14-10-2009';


Eso me retorna "0" si "campo" no existe en al BD según la fecha.
  #13 (permalink)  
Antiguo 08/03/2013, 12:47
 
Fecha de Ingreso: marzo-2013
Mensajes: 1
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Reemplazar null por cero en select

ssh, en ese caso la consulta devuelve dos columnas, en mi caso necesitaba una sola columna y lo resolví de la siguiente manera.

SELECT CASE WHEN COUNT(1) = 0
THEN 0
ELSE count(campo) END
FROM tabla
WHERE fecha = '14-10-2009';


Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:29.