Alisson Viegas | Acsiv Sistemas escreveu:
> Ribamar, to migrando pra SGDB (sempre usei DBF).
> 
> Poderiam me explicar por quê correr dos nulos.
> 
> Sempre pensei que nulos “aliviava” a carga do banco.
> 
>  
> 
>  
> 
> At.te,
> Alisson Viegas
> [EMAIL PROTECTED]
> 
> ---
> Acsiv Sistemas
> www.acsiv.com.br <http://www.acsiv.com.br/>
> 
>  
> 
>  
> 
> *De:* [EMAIL PROTECTED] 
> [mailto:[EMAIL PROTECTED] *Em nome de 
> *Ribamar Sousa
> *Enviada em:* quarta-feira, 13 de agosto de 2008 12:12
> *Para:* Comunidade PostgreSQL Brasileira
> *Assunto:* Re: [pgbr-geral] Hubert Lubaczewski: NULLs vs. NOT IN()
> 
>  
> 
> 2008/8/13 Osvaldo Kussama <[EMAIL PROTECTED] 
> <mailto:[EMAIL PROTECTED]>>
> 
>     Ribamar:
> 
>     Talvez seja o caso descrito no manual:
>     
> http://www.postgresql.org/docs/current/interactive/functions-subquery.html#AEN15302
> 
>     "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."
> 
>     A combinação de NULL com NOT IN nem sempre dá o resultado que
>     usualmente (bom senso?) esperamos.
> 
>     Osvaldo
> 
> 
> Osvaldo, parece que isso reforça a grande recomendação dos gurus e mestre:
> 
> "Corram dos nulos!".
> 
> Mas e se o bichim correr atraz da gente? :)
> 


A idéia de NULL é algo que normalmente confunde os iniciantes em banco 
de dados.

Usualmente NULL significa algo desconhecido, algo que não tem valor.

NULL não é uma string vazia '' (uma string vazia é algo conhecido: é 
uma string de comprimento zero).

Outra grande confusão: NULL = NULL? ou NULL <> NULL?
Como NULL é algo desconhecido como posso saber se: "algo que não sei o 
que é" pode ser igual (ou diferente) de "algo que não tenho a menor 
idéia do que seja"? Por isso a resposta para qualquer destas duas 
comparações é NULL! (isto é: não sei).

E se comparar algum valor com NULL? Por ex. 10 = NULL ou 10 <> NULL? 
Também em ambos os casos o resultado é NULL.

Como saber se uma expressão é ou não NULL?
Utilize: IS [ NOT ] NULL
Assim: 10 IS NULL dá como resposta falso.

Como fazer para considerar como igual ou diferente o resultado de 
comparações envolvendo NULL?
Utilize: IS [ NOT ] DISTINCT FROM
Assim: 10 IS DISTINCT FROM NULL dá como resposta verdadeiro;
NULL IS DISTINCT FROM NULL dá como resposta falso.

E tenha muito cuidado com a utilização de IN e NOT IN.

SELECT 10 IN (10,20); ==> verdadeiro
SELECT 10 NOT IN (10,20); ==> falso
SELECT 10 IN (NULL,10,20); ==> verdadeiro
SELECT 10 NOT IN (NULL,10,20); ==> false

SELECT 30 IN (10,20); ==> falso
SELECT 30 NOT IN (10,20); ==> verdadeiro
SELECT 30 IN (NULL,10,20); ==> NULL
SELECT 30 NOT IN (NULL,10,20); ==> NULL

Se a expressão do lado esquerdo do IN (ou NOT IN) for NULL o resultado 
será sempre NULL.

Por isso sempre tome cuidado ao utilizar NULL.

Ele pode ser útil?
Sim, por ex. uma data de encerramento contendo NULL normalmente 
significa que o item ainda está ativo. É só tomar os devidos cuidados 
ao utilizá-lo.

Osvaldo
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a