Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-04-2009
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Exists or not Exists that is the question

Exists or not Exists that is the question

Mi duda es más bien filosófica y es la siguiente:

Si hago esta consulta:

Código SQL [-]
 
SELECT CAMPO
  FROM TABLA
 WHERE CONDICION

En en caso de que no existiera para esa condicion un valor de campo, nulo o no, como podría hacer para que CAMPO devuelva 0.

Si existiera un registro y CAMPO fuera NULL, la siguiente seria la solución (un NVL, igualmente, segun el motor de BD que use)

Código SQL [-]
 
SELECT IFNULL(CAMPO,0)
  FROM TABLA
 WHERE CONDICION

Pero si no existe registro, no devolverá nada, y yo quiero que me devuelva 0.

Es posible?

NOTA: sin usar COUNT.

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #2  
Antiguo 05-04-2009
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
¡Hola!

No mencionas qué motor utilizas, pero en Firebird funciona bien esto:

Código SQL [-]
Select Coalesce (Campo, 0) As Campo From Tabla
Right Outer Join RDB$DataBase On 1 = 1

El truco es hacer una unión exterior por la derecha con una tabla o cursor que tenga uno y sólo una fila.

Saludos a cualesquiera.

Al González.
Responder Con Cita
  #3  
Antiguo 05-04-2009
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
No mencionas qué motor utilizas.(...)
En realidad Al, es una duda existencialista que tengo, más alla del motor a usar, por eso el toque filosófico.

Porque si analizamos lo real, si vos no tenes dinero, podriamos decir que tenés 0 monedas, con lo cual la nada (null) tendría un valor tangible.
Al margén de si tendria sentido o no almacenar un valor 0 o inexistente de algo.
Es una cuestión lógica, para ser pobre al menos hay que tener nada, con lo cual la nada tiene valor, asi sea nulo o despreciable, y asi cualquier combinación posible.

Si bien pareciera ser una pregunta extraordinariamente rara, estoy enfocando el análisis hacia un desarrollo sobre el modelado de datos inexistentes o absurdos, sobre factibles relaciones combinacionales inexistentes, es un tema bastante complejo, y esta relacionado hacia el análisis genético. Es un modelo matemático en el cual, cuando no sabemos el resultado, al menos sabemos lo que NO puede ser, no se si me explico.

Volviendo a la razón, estoy utilizando mySQL (4.1/5)

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;

Última edición por MaMu fecha: 05-04-2009 a las 01:21:24.
Responder Con Cita
  #4  
Antiguo 05-04-2009
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 18
javier7ar Va por buen camino
en SQL Server podes hacer esto:

Código SQL [-]
select isNull((select CAMPO from TABLA where CONDICION),0) as NombreCampo

Nota: debe ir con esos parentesis, si los sacas da error de sintaxis, asi que copialo tal cual

Saludos
Responder Con Cita
  #5  
Antiguo 05-04-2009
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
Cita:
Empezado por javier7ar Ver Mensaje
en SQL Server podes hacer esto:


Código SQL [-]
select isNull((select CAMPO from TABLA where CONDICION),0)





Nota: debe ir con esos parentesis, si los sacas da error de sintaxis, asi que copialo tal cual

Saludos
NO Javier.
ISNULL, sería como IFNULL, y hasta un DECODE o CASE comparando si es NULL, porque el NULL es el resultado de la existencia de un campo cuyo valor es nulo, pero si no existe registro? NULL sería siendo NULL.
Ejemplo, si tengo 3 campos, y uno de ellos es NULL con esa funcion SI podria devolver 0, pero si no existe ninguno de los 3 campos? NULL es NULL, no puede ser NULL lo que no existe, he aquí el dilema en cuestión.

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
  #6  
Antiguo 05-04-2009
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 18
javier7ar Va por buen camino
no MaMu, probalo que eso anda, pero solo funciona cuando el select de adentro devuelve 1 sola fila o no devuelve ninguna fila (porque cuando no devuelve ninguna en SQL Server se puede tomar como NULL) si devuelve mas de una fila te va a dar error. Probalo
Saludos
Responder Con Cita
  #7  
Antiguo 05-04-2009
Avatar de javier7ar
javier7ar javier7ar is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 124
Poder: 18
javier7ar Va por buen camino
otra cosa a tener en cuenta, si trabajas con delphi, supongo que vas a tener una consulta con este SQL

Código SQL [-]
select CAMPO
from TABLA
where CONDICION

al abrir la Query, si el valor de CAMPO es NULL o si la Query esta vacia (no se devolvieron filas como el caso que planteas) el valor de Query['CAMPO'] va a ser NULL en los dos casos, y ahi es donde tenes que aplicar la funcion isNull (en el codigo del Delphi) Por lo menos asi soluciono yo estos temas.
Entonces te quedaria asi:

Query.Open;
variable:=isNull(Query['CAMPO'],0);
Query.Close;

Funciona tanto para cuando el campo es NULL o para cuando no hay resultado.

Nota: La funcion isNull en Delphi no existe, asi que la tenes que hacer vos, seria algo asi:
Código Delphi [-]
Function IsNull(A,B:Variant):Variant;
begin
  if (A <> NULL) then
    isNull:=A
  else
    isNUll:=B;
end;
Responder Con Cita
  #8  
Antiguo 05-04-2009
Avatar de MaMu
MaMu MaMu is offline
Miembro
 
Registrado: abr 2006
Ubicación: Argentina
Posts: 863
Poder: 18
MaMu Va por buen camino
javier7ar

Bueno pensándolo como lo expusiste es una buena idea. Lo voy a probar.

Saludos
__________________
Código Delphi [-]
 
try 
ProgramarMicro(80C52,'Intel',MnHex,True);
except
On Exception do
MicroChip.IsPresent(True);
end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Commando IBtable1.Exists no me funciona pmtzg Conexión con bases de datos 1 04-06-2008 11:25:53
Problema serios con predicados IN, NOT IN, EXISTS, ... mlara Firebird e Interbase 7 15-05-2008 20:43:41
Transaccion con if y con exists zvf SQL 4 18-09-2007 19:52:44
Error en el Exists Payola2011 MySQL 7 31-01-2006 20:17:47
-502 Declared cursor already exists Carlitos Firebird e Interbase 4 30-09-2003 18:18:22


La franja horaria es GMT +2. Ahora son las 18:35:32.


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
Copyright 1996-2007 Club Delphi