Re: IN query operator and NULL values

Поиск
Список
Период
Сортировка
От Andy Anderson
Тема Re: IN query operator and NULL values
Дата
Msg-id E91656F3-EB2D-411E-AAAE-4EB67E349526@amherst.edu
обсуждение исходный текст
Ответ на Re: IN query operator and NULL values  (Alban Hertroys <dalroi@solfertje.student.utwente.nl>)
Список pgsql-general
The non-compliance fix is described here:

http://www.postgresql.org/docs/8.3/interactive/functions-
comparison.html says:

>> To check whether a value is or is not null, use the constructs
>>
>> expression IS NULL
>> expression IS NOT NULL
>> or the equivalent, but nonstandard, constructs
>>
>> ....
>>
>> Note: If the expression is row-valued, then IS NULL is true when
>> the row expression itself is null or when all the row's fields are
>> null, while IS NOT NULL is true when the row expression itself is
>> non-null and all the row's fields are non-null. This definition
>> conforms to the SQL standard, and is a change from the
>> inconsistent behavior exhibited by PostgreSQL versions prior to 8.2.

-- Andy

On May 16, 2008, at 12:54 PM, Alban Hertroys wrote:

> On May 16, 2008, at 5:40 PM, Denis Gasparin wrote:
>
>> Hi all.
>>
>> I have a problem with the IN operator in PostgreSQL 8.2.7. Here it
>> is an example that reproduce the problem:
>>
>> test=# select * from test where b in(1,null);
>> a | b
>> ---+---
>> 1 | 1
>>
>> In the last resultset, i was expecting two records the one with b
>> = 1 and the one with b = null.
>> PostgreSQL instead returns only the value with not null values.
>
> Yes, of course it does. NULL means "unknown". Comparing it to
> anything results in NULL, as the result is "unknown" again. What
> happens is this:
>
> development=> select b, coalesce( (b in (1, null))::text, 'NULL')
> from test;
>  b | coalesce
> ---+----------
>  1 | true
>  2 | NULL
>    | NULL
> (3 rows)
>
>
> The where clause can only handle true or false (as per the SQL
> spec), so it assumes "unknown" means the record wasn't a match.
>
>> I tested the example also in PostgreSQL 8.1 and it works correctly
>> (two records).
>
> That looks like a bug in 8.1.
>
>> So the question is: what has changed from 8.1 to 8.2?
>
> I think a bug was fixed ;)
>
> Alban Hertroys
>
> --
> If you can't see the forest for the trees,
> cut the trees and you'll see there is no forest.
>
>
> !DSPAM:737,482dbc5e927668957138674!
>
>
>
> --
> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general


В списке pgsql-general по дате отправления:

Предыдущее
От: Alban Hertroys
Дата:
Сообщение: Re: IN query operator and NULL values
Следующее
От: "Michael P. Soulier"
Дата:
Сообщение: transaction logging