Re: Comportamiento correcto del "not in" ?

Lists: pgsql-es-ayuda
From: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
To: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Comportamiento correcto del "not in" ?
Date: 2012-07-09 17:06:37
Message-ID: CANm+PCD8itZcCVqumLcnu68os_zcV=YuC3X5aTmugfEnGzwjyA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola gente como andan?
Tengo una duda, resulta que la siguiente consulta a mi entender debería
devolver 43 filas:
select *
from uad.beneficiarios
where
estado_envio = 'n' and
tipo_transaccion = 'M' and
clave_beneficiario not in (
select clavebeneficiario
from nacer.smiafiliados
)
Pero contrario a lo que esperaba, la consulta devuelve 0 filas.

Controlando que dentro y fuera de la subconsulta la clavebeneficiario sea
no nula, la consulta devuelve lo que esperaba.
select *
from uad.beneficiarios
where
estado_envio = 'n' and
tipo_transaccion = 'M' and
*clave_beneficiario is not null* and
clave_beneficiario not in (
select clavebeneficiario
from nacer.smiafiliados
where *clavebeneficiario is not null*
)

Porque? es el comportamiento normal?

Guillermo Villanueva


From: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
To: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Comportamiento correcto del "not in" ?
Date: 2012-07-10 13:41:16
Message-ID: CAEc04cpDWfXeEVrHFMH6_xT8qqN_m0=2smf8k_52wQM511cZyA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

No se porque lo hace, haria falta que hicieras un explain

Pero intenta conesta otra consulta

select *
from uad.beneficiarios as b
where
estado_envio = 'n' and
tipo_transaccion = 'M' and
clave_beneficiario not in (
select clavebeneficiario
from nacer.smiafiliados as s
where b.*clavebeneficiario = s.**clavebeneficiario*
)


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Comportamiento correcto del "not in" ?
Date: 2012-07-10 14:07:47
Message-ID: 1341928853-sup-1011@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


Excerpts from Guillermo Villanueva's message of lun jul 09 13:06:37 -0400 2012:

> Controlando que dentro y fuera de la subconsulta la clavebeneficiario sea
> no nula, la consulta devuelve lo que esperaba.

> Porque? es el comportamiento normal?

Es extraño la primera vez que lo ves, pero la explicación es que la
lógica booleana de tres valores exige que sea así:

http://www.postgresql.org/docs/9.1/static/functions-subquery.html
Mira 9.20.3 NOT IN. Dice:
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.

traduzco:
"si la expresión a la izquierda retorna nulo, o si no hay valores
iguales a la derecha y al menos uno de los valores de la derecha es
nulo, el resultado del NOT IN es nulo, no verdadero"

This is in accordance with SQL's normal rules for
Boolean combinations of null values.

Puede ser más simple conceptualmente reformular la consulta usando NOT
EXISTS.

--
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>


From: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Comportamiento correcto del "not in" ?
Date: 2012-07-17 01:05:52
Message-ID: CANm+PCDm76f15=j8UuTz_Rwa-6QMsKye1vc4+TE+8YSzNd2sYw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Un poco tarde mi agradecimiento por las respuestas.
Alvaro, como siempre, muy claro y conciso.
Es como vos decís es extraño y a mi entender no muy lógico a primera vista,
no sabía de ese estándar, viéndolo en ejemplos concretos podríamos decir
que:
4 not in (1, 2, 5, null)
no es verdadero!

Es así?

Guillermo Villanueva

El 10 de julio de 2012 11:07, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>escribió:

>
> Excerpts from Guillermo Villanueva's message of lun jul 09 13:06:37 -0400
> 2012:
>
> > Controlando que dentro y fuera de la subconsulta la clavebeneficiario
> sea
> > no nula, la consulta devuelve lo que esperaba.
>
> > Porque? es el comportamiento normal?
>
> Es extraño la primera vez que lo ves, pero la explicación es que la
> lógica booleana de tres valores exige que sea así:
>
> http://www.postgresql.org/docs/9.1/static/functions-subquery.html
> Mira 9.20.3 NOT IN. Dice:
> 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.
>
> traduzco:
> "si la expresión a la izquierda retorna nulo, o si no hay valores
> iguales a la derecha y al menos uno de los valores de la derecha es
> nulo, el resultado del NOT IN es nulo, no verdadero"
>
> This is in accordance with SQL's normal rules for
> Boolean combinations of null values.
>
>
> Puede ser más simple conceptualmente reformular la consulta usando NOT
> EXISTS.
>
> --
> Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
>


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Comportamiento correcto del "not in" ?
Date: 2012-07-17 17:35:12
Message-ID: 1342546446-sup-2611@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


Excerpts from Guillermo Villanueva's message of lun jul 16 21:05:52 -0400 2012:
> Un poco tarde mi agradecimiento por las respuestas.
> Alvaro, como siempre, muy claro y conciso.
> Es como vos decís es extraño y a mi entender no muy lógico a primera vista,
> no sabía de ese estándar, viéndolo en ejemplos concretos podríamos decir
> que:
> 4 not in (1, 2, 5, null)
> no es verdadero!
>
> Es así?

Claro, no es verdadero. No sé qué elemento es el último, por lo tanto
no puedo decir que 4 está en ese conjunto, y tampoco puedo decir que no
está. La respuesta correcta entonces es NULL.

--
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>


From: ichbinrene(at)gmail(dot)com
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Comportamiento correcto del "not in" ?
Date: 2012-07-18 02:03:55
Message-ID: 25820901.6PTUWX4VYe@linux-id39.site
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On Tuesday 17 July 2012 13:35:12 Alvaro Herrera wrote:
> Excerpts from Guillermo Villanueva's message of lun jul 16 21:05:52 -0400
2012:
> > Un poco tarde mi agradecimiento por las respuestas.
> > Alvaro, como siempre, muy claro y conciso.
> > Es como vos decís es extraño y a mi entender no muy lógico a primera
> > vista, no sabía de ese estándar, viéndolo en ejemplos concretos
> > podríamos decir que:
> > 4 not in (1, 2, 5, null)
> > no es verdadero!
> >
> > Es así?
>
> Claro, no es verdadero. No sé qué elemento es el último, por lo tanto
> no puedo decir que 4 está en ese conjunto, y tampoco puedo decir que no
> está. La respuesta correcta entonces es NULL.

A mi también me costó trabajo al principio entender este asunto,el cual se
explica porque 4 NOT IN (1,2,5,NULL) se traduce internamente como:

NOT (4=1 OR 4=2 OR 4=5 OR 4=NULL)

Y puesto que el resultado de 4=NULL es NULL , todas las demás comparaciones
se nulifican también al compararse con este resultado ya que toda operación de
comparación o aritmética que involucre NULL regresará NULL.
Saludos.
@iCodeiExist


From: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Comportamiento correcto del "not in" ?
Date: 2012-07-20 18:03:55
Message-ID: CANm+PCDDgrh+jRoUO0g_iDaPRWHGms82QWmnT+sOnej=RrXuDA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Gracias por la aclaración.
Entendido
Guillermo Villanueva

El 17 de julio de 2012 14:35, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>escribió:

>
> Excerpts from Guillermo Villanueva's message of lun jul 16 21:05:52 -0400
> 2012:
> > Un poco tarde mi agradecimiento por las respuestas.
> > Alvaro, como siempre, muy claro y conciso.
> > Es como vos decís es extraño y a mi entender no muy lógico a primera
> vista,
> > no sabía de ese estándar, viéndolo en ejemplos concretos podríamos decir
> > que:
> > 4 not in (1, 2, 5, null)
> > no es verdadero!
> >
> > Es así?
>
> Claro, no es verdadero. No sé qué elemento es el último, por lo tanto
> no puedo decir que 4 está en ese conjunto, y tampoco puedo decir que no
> está. La respuesta correcta entonces es NULL.
>
> --
> Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
>


From: Guillermo Villanueva <guillermovil(at)gmail(dot)com>
To: ichbinrene(at)gmail(dot)com
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Comportamiento correcto del "not in" ?
Date: 2012-07-20 18:04:56
Message-ID: CANm+PCDt=mu05H+uaXYXABM0sJGUP9WePF-16_My0k-kiQa2AQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Gracias por la aclaración.
Entendido.

*No había pensado que el NOT IN () se traducía de esa manera. *

Guillermo Villanueva

El 17 de julio de 2012 23:03, <ichbinrene(at)gmail(dot)com> escribió:

> On Tuesday 17 July 2012 13:35:12 Alvaro Herrera wrote:
> > Excerpts from Guillermo Villanueva's message of lun jul 16 21:05:52 -0400
> 2012:
> > > Un poco tarde mi agradecimiento por las respuestas.
> > > Alvaro, como siempre, muy claro y conciso.
> > > Es como vos decís es extraño y a mi entender no muy lógico a primera
> > > vista, no sabía de ese estándar, viéndolo en ejemplos concretos
> > > podríamos decir que:
> > > 4 not in (1, 2, 5, null)
> > > no es verdadero!
> > >
> > > Es así?
> >
> > Claro, no es verdadero. No sé qué elemento es el último, por lo tanto
> > no puedo decir que 4 está en ese conjunto, y tampoco puedo decir que no
> > está. La respuesta correcta entonces es NULL.
>
> A mi también me costó trabajo al principio entender este asunto,el cual se
> explica porque 4 NOT IN (1,2,5,NULL) se traduce internamente como:
>
> NOT (4=1 OR 4=2 OR 4=5 OR 4=NULL)
>
> Y puesto que el resultado de 4=NULL es NULL , todas las demás comparaciones
> se nulifican también al compararse con este resultado ya que toda
> operación de
> comparación o aritmética que involucre NULL regresará NULL.
> Saludos.
> @iCodeiExist
> -
> Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org
> )
> Para cambiar tu suscripción:
> http://www.postgresql.org/mailpref/pgsql-es-ayuda
>