Re: [pgsql-es-ayuda] No muestra datos si un campo relacionado está vacío.

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

Alvaro Herrera escribió:
> 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).
>

Hola Alvaro.

Gracias por la ayuda.

Observo, con lo que dices, que esa consulta funciona sólo en el caso de
NULL, pero ahora tenemos el problema a la inversa. hmmmmmm

Para solucionarlo, puedo aplicar en php un condicional para que en el
caso de NULL aplique un select o en caso contrario otro. Aunque esta
solución no me gusta especialmente.

Sólo se me ocurre, otro modo de solucionarlo, mediante una función en la
base de datos. No se si lo que estoy diciendo es del todo correcto, pues
no tengo demasiada experiencia con las funciones.

¿Es esto correcto?. ¿Te referías a esto para solucionarlo?.

Gracias.

----
Saludos

Pablo

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2006-07-27 12:39:05 Re: Re: [pgsql-es-ayuda] No muestra datos si un campo relacionado está vacío.
Previous Message Jaime Casanova 2006-07-27 06:39:01 Re: Postgresql sobre unxi y sobre linux