Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Exists or not Exists that is the question (https://www.clubdelphi.com/foros/showthread.php?t=64508)

MaMu 04-04-2009 22:44:34

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

Al González 05-04-2009 00:43:40

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

MaMu 05-04-2009 01:16:52

Cita:

Empezado por Al González (Mensaje 343921)
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 01:21:00

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

MaMu 05-04-2009 01:24:10

Cita:

Empezado por javier7ar (Mensaje 343928)
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

javier7ar 05-04-2009 01: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 01:59:50

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;

MaMu 05-04-2009 19:29:55

javier7ar

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

Saludos


La franja horaria es GMT +2. Ahora son las 01:36:49.

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