Re: No muestra datos si un campo relacionado está vacío.

From: Alvaro Herrera <alvherre(at)commandprompt(dot)com>
To: Pablo Braulio <brulics(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: No muestra datos si un campo relacionado está vacío.
Date: 2006-07-27 02:27:14
Message-ID: 20060727022714.GC13294@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Pablo Braulio escribió:

> select id, fichero from ficheros where empresa = '10' and id not
> in(select fichero from recursos_programas where id = '10');
> id | fichero
> ----+---------
> (0 filas)
>
> No devuelve nada.
>
> La diferencia está en que el campo "fichero" de la primera, contiene un
> valor, y en el segundo caso, no.

Una correccion de terminologia: no se dice "no contiene un valor"
(tampoco se dice "esta vacio"), se dice "tiene valor nulo" (NULL).

Ahora bien, este comportamiento esta documentado. Dice el manual

9.16.3. NOT IN

expression NOT IN (subquery)

The right-hand side is a parenthesized subquery, which must
return exactly one column. The left-hand expression is evaluated
and compared to each row of the subquery result. The result of
NOT IN is "true" if only unequal subquery rows are found
(including the special case where the subquery returns no rows).
The result is "false" if any equal row is found.

Note that if the left-hand expression yields null, or if there
are no equal right-hand values and at least one right-hand row
yields null, the result of the NOT IN construct will be null,
not true. This is in accordance with SQL's normal rules for
Boolean combinations of null values.

Observa que se menciona explicitamente el comportamiento con valores
NULL. En tu caso, podrias obtener los valores que buscas asi:

SELECT id, fichero
FROM ficheros
WHERE empresa = '10' and
id NOT IN(SELECT fichero FROM recursos_programas WHERE id = '10') IS NULL;

Observa que he agregado "IS NULL" al final del NOT IN.

Obviamente esta consulta no hace lo que esperas cuando el resultado del
NOT IN no es null ;-) Te queda de ejercicio hacer que funcione para
ambos casos. (Obviamente debes publicar el resultado correcto aca).

--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2006-07-27 02:27:51 Re: Diagrama E-R
Previous Message Alvaro Herrera 2006-07-27 02:02:31 Re: Campo TEXT y saltos de linea