PDA

Ver la Versión Completa : Exists or not Exists that is the question


MaMu
04-04-2009, 21:44:34
Exists or not Exists that is the question

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

Si hago esta consulta:


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)


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

Al González
04-04-2009, 23:43:40
¡Hola!

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


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. :)

MaMu
05-04-2009, 00:16:52
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

javier7ar
05-04-2009, 00:21:00
en SQL Server podes hacer esto:


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

MaMu
05-04-2009, 00:24:10
en SQL Server podes hacer esto:


Código SQL [-] (http://www.clubdelphi.com/foros/#)
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

javier7ar
05-04-2009, 00:45:27
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

javier7ar
05-04-2009, 00:59:50
otra cosa a tener en cuenta, si trabajas con delphi, supongo que vas a tener una consulta con este 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:

Function IsNull(A,B:Variant):Variant;
begin
if (A <> NULL) then
isNull:=A
else
isNUll:=B;
end;

MaMu
05-04-2009, 18:29:55
javier7ar

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

Saludos