Thread: select, where and null-values (or: select null<>'1' is fuzzy)

select, where and null-values (or: select null<>'1' is fuzzy)

From
Peter Pilsl
Date:
I've a problem when selecting values out a table.

manana=# select * from test;
 l1 | l2 | l3
----+----+----
 1  | 2  | 3
 2  | 3  | 4
 3  | 4  | 5
 4  | 5  | 6
    | 5  | 6
(5 rows)

where l1 is NULL in the last line.
now I do

manana=# select * from test where l1<>1;
 l1 | l2 | l3
----+----+----
 2  | 3  | 4
 3  | 4  | 5
 4  | 5  | 6
(3 rows)
and dont get the line with the null-entry !
In fact the problem is also describeable like this:

manana=# select NULL<>'1';
 ?column?
----------

(1 row)

This gives neither true nor false.

Why is this like this and how can I work around ?

thnx,
peter


--
mag. peter pilsl

phone: +43 676 3574035
fax  : +43 676 3546512
email: pilsl@goldfisch.at
sms  : pilsl@max.mail.at

pgp-key available

Re: select, where and null-values (or: select null<>'1' is fuzzy)

From
Peter Eisentraut
Date:
Peter Pilsl writes:

> manana=# select NULL<>'1';
>  ?column?
> ----------
>
> (1 row)
>
> This gives neither true nor false.

It gives NULL. This is correct three-valued Boolean logic.

--
Peter Eisentraut   peter_e@gmx.net   http://funkturm.homeip.net/~peter


Re: select, where and null-values (or: select null<>'1' is fuzzy)

From
"Thalis A. Kalfigopoulos"
Date:
On Tue, 12 Jun 2001, Peter Pilsl wrote:

> I've a problem when selecting values out a table.
>
> manana=# select * from test;
>  l1 | l2 | l3
> ----+----+----
>  1  | 2  | 3
>  2  | 3  | 4
>  3  | 4  | 5
>  4  | 5  | 6
>     | 5  | 6
> (5 rows)
>
> where l1 is NULL in the last line.
> now I do
>
> manana=# select * from test where l1<>1;
>  l1 | l2 | l3
> ----+----+----
>  2  | 3  | 4
>  3  | 4  | 5
>  4  | 5  | 6
> (3 rows)
> and dont get the line with the null-entry !
> In fact the problem is also describeable like this:
>
> manana=# select NULL<>'1';
>  ?column?
> ----------
>
> (1 row)
>
> This gives neither true nor false.
>
> Why is this like this and how can I work around ?

Don't think of NULL as a value. Think of it as "unknown". Therefore since it is "unknown", Pg cannot answer to you
whetherit is = or <> to a value such as '1'. NULL infact is so damn NULL it's not even equal to itself. This is why you
haveto use the special IS [NOT] NULL operator. To get the desired last row in the result set of your query, you need to
do:

select * from test where l1<>1 OR l1 IS NULL;

but think again if you really want this additional row.


cheers,
thalis


>
> thnx,
> peter
>
>
> --
> mag. peter pilsl
>
> phone: +43 676 3574035
> fax  : +43 676 3546512
> email: pilsl@goldfisch.at
> sms  : pilsl@max.mail.at
>
> pgp-key available
>
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to majordomo@postgresql.org)


Re: select, where and null-values (or: select null<>'1' is fuzzy)

From
Stephan Szabo
Date:
> I've a problem when selecting values out a table.

It's correct.  NULL<>1 is defined as NULL by the spec.
Where clauses only return rows that the expression is true
and so will not return the NULL row.

If you want the null rows to show up, you'll need to either
use coalesce or add or blah IS NULL to the expression.



Re: select, where and null-values (or: select null<>'1' is fuzzy)

From
Doug McNaught
Date:
Peter Pilsl <pilsl@goldfisch.at> writes:

> I've a problem when selecting values out a table.
>
> manana=# select * from test;
>  l1 | l2 | l3
> ----+----+----
>  1  | 2  | 3
>  2  | 3  | 4
>  3  | 4  | 5
>  4  | 5  | 6
>     | 5  | 6
> (5 rows)
>
> where l1 is NULL in the last line.
> now I do
>
> manana=# select * from test where l1<>1;
>  l1 | l2 | l3
> ----+----+----
>  2  | 3  | 4
>  3  | 4  | 5
>  4  | 5  | 6
> (3 rows)
> and dont get the line with the null-entry !

This has been discussed a lot recently.  Basically NULL means
"unknown"; so you can't say it's equal or unequal to any non-NULL
value.  The above behavior is in accordance with the SQL standard.

If you tell us what you are trying to do (rather than giving us a toy
example) perhaps we can make some suggestions.

-Doug
--
The rain man gave me two cures; he said jump right in,
The first was Texas medicine--the second was just railroad gin,
And like a fool I mixed them, and it strangled up my mind,
Now people just get uglier, and I got no sense of time...          --Dylan