Fw: select null + 0 question
Oops forgot to cc the list.
Unfortunately, intra-row functions using nulls return nulls. Inter-row
functions "usually" ignore the nulls. I think there may be a few
exceptions.
Though there is a relational theory which has is rigorously consistent,
nulls are not part of the theory. Nulls are basically what
someone/somewhere
thought of as a convenient tool (which it is) but has no theoretical
underpinning and is dangerous. I use it because I feel that I have enough
experience but perhaps I'll be stung one day.It has been discussed on the list before that in Oracle that in Oracle an
empty string and null are the same. However Postgres treats an empty
string
'' as an actual value and not as null.
I just happened to notice another difference recently between Oracle and
Postgresql for the clauseWHERE 1 IN (1,2,NULL)
In Oracle, this clause is false because 1 compared to a NULL is false.
However, Postgresql will return a true. I actually don't know what the
ANSI
Show quoted text
standard is for this case. Perhaps someone else on this list will know.
Perhaps the standard body never even thought of this. Yes, I was actually
stung by this particular while using it in Oracle.Vincent Hikida,
Member of Technical Staff - Urbana Software, Inc.
"A Personalized Learning Experience"www.UrbanaSoft.com
----- Original Message -----
From: "Jean-Christian Imbeault" <jc@mega-bucks.co.jp>
To: <pgsql-general@postgresql.org>
Sent: Sunday, July 13, 2003 10:42 PM
Subject: [GENERAL] select null + 0 questionWhy is it that "select null + 1" gives null but "select sum(a) from
table" where there are null entries returns an integer?Shouldn't the sum() and "+" operators behave the same?
TAL=# select null + 0;
?column?
----------(1 row)
TAL=# select * from a;
a
---1
(3 rows)TAL=# select sum(a) from a;
sum
-----
1
(1 row)Thanks,
Jean-Christian Imbeault
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend
On Sun, Jul 13, 2003 at 11:14:15PM -0700, Vincent Hikida wrote:
Oops forgot to cc the list.
I just happened to notice another difference recently between Oracle and
Postgresql for the clauseWHERE 1 IN (1,2,NULL)
In Oracle, this clause is false because 1 compared to a NULL is false.
However, Postgresql will return a true. I actually don't know what theANSI
standard is for this case. Perhaps someone else on this list will know.
Perhaps the standard body never even thought of this. Yes, I was actually
stung by this particular while using it in Oracle.
I can;t comment on what the correct answer is, but I beleive the reason it
works in Postgres is because the expression is expanded to:
WHERE (1=1) OR (1=0) OR (1=NULL)
which becomes:
WHERE TRUE OR FALSE OR NULL
which is TRUE. (standard tri-value logic)
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/
Show quoted text
"the West won the world not by the superiority of its ideas or values or
religion but rather by its superiority in applying organized violence.
Westerners often forget this fact, non-Westerners never do."
- Samuel P. Huntington
On Sun, 13 Jul 2003, Vincent Hikida wrote:
Oops forgot to cc the list.
Unfortunately, intra-row functions using nulls return nulls. Inter-row
functions "usually" ignore the nulls. I think there may be a fewexceptions.
Though there is a relational theory which has is rigorously consistent,
nulls are not part of the theory. Nulls are basically whatsomeone/somewhere
thought of as a convenient tool (which it is) but has no theoretical
underpinning and is dangerous. I use it because I feel that I have enough
experience but perhaps I'll be stung one day.It has been discussed on the list before that in Oracle that in Oracle an
empty string and null are the same. However Postgres treats an emptystring
'' as an actual value and not as null.
I just happened to notice another difference recently between Oracle and
Postgresql for the clauseWHERE 1 IN (1,2,NULL)
In Oracle, this clause is false because 1 compared to a NULL is false.
If this is really true, then I believe Oracle does not implement this
feature correctly. By my reading of SQL92, RVC IN IPV is equivalent to
RVC =ANY IPV and in 8.7 GR2c, "If the implied <comparison predicate> is
true for at least one row RT in T, then R <comp op> <some> T" is true
which I believe holds for the case above.
This was executed via sql+ on an Oracle 9i installation:
SQL> select 1 from dual where 1 in (1,2,null);
1
----------
1
SQL> select 1 from dual where 1 in (null);
no rows selected
I would say the Oracle implementation is correct and the same as in
Postgres. For your problem I would check the other parts of the query.
Cheers,
Csaba.
Show quoted text
On Mon, 2003-07-14 at 08:14, Vincent Hikida wrote:
Oops forgot to cc the list.
Unfortunately, intra-row functions using nulls return nulls. Inter-row
functions "usually" ignore the nulls. I think there may be a fewexceptions.
Though there is a relational theory which has is rigorously consistent,
nulls are not part of the theory. Nulls are basically whatsomeone/somewhere
thought of as a convenient tool (which it is) but has no theoretical
underpinning and is dangerous. I use it because I feel that I have enough
experience but perhaps I'll be stung one day.It has been discussed on the list before that in Oracle that in Oracle an
empty string and null are the same. However Postgres treats an emptystring
'' as an actual value and not as null.
I just happened to notice another difference recently between Oracle and
Postgresql for the clauseWHERE 1 IN (1,2,NULL)
In Oracle, this clause is false because 1 compared to a NULL is false.
However, Postgresql will return a true. I actually don't know what theANSI
standard is for this case. Perhaps someone else on this list will know.
Perhaps the standard body never even thought of this. Yes, I was actually
stung by this particular while using it in Oracle.Vincent Hikida,
Member of Technical Staff - Urbana Software, Inc.
"A Personalized Learning Experience"www.UrbanaSoft.com
----- Original Message -----
From: "Jean-Christian Imbeault" <jc@mega-bucks.co.jp>
To: <pgsql-general@postgresql.org>
Sent: Sunday, July 13, 2003 10:42 PM
Subject: [GENERAL] select null + 0 questionWhy is it that "select null + 1" gives null but "select sum(a) from
table" where there are null entries returns an integer?Shouldn't the sum() and "+" operators behave the same?
TAL=# select null + 0;
?column?
----------(1 row)
TAL=# select * from a;
a
---1
(3 rows)TAL=# select sum(a) from a;
sum
-----
1
(1 row)Thanks,
Jean-Christian Imbeault
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster
Thanks for checkin on this Csaba. I should have tried this again myself. I
have 9i on my machine and it works as you said. Of course I had this problem
on 8i perhaps I was mistaken. If someone else has 8i I would appreciate them
testing this.
Vincent Hikida,
Member of Technical Staff - Urbana Software, Inc.
"A Personalized Learning Experience"
www.UrbanaSoft.com
----- Original Message -----
From: "Csaba Nagy" <nagy@ecircle-ag.com>
To: "Vincent Hikida" <vhikida@inreach.com>
Cc: "Postgres general mailing list" <pgsql-general@postgresql.org>
Sent: Monday, July 14, 2003 1:50 AM
Subject: Re: Fw: [GENERAL] select null + 0 question
This was executed via sql+ on an Oracle 9i installation:
SQL> select 1 from dual where 1 in (1,2,null);
1
----------
1SQL> select 1 from dual where 1 in (null);
no rows selected
I would say the Oracle implementation is correct and the same as in
Postgres. For your problem I would check the other parts of the query.Cheers,
Csaba.On Mon, 2003-07-14 at 08:14, Vincent Hikida wrote:
Oops forgot to cc the list.
Unfortunately, intra-row functions using nulls return nulls. Inter-row
functions "usually" ignore the nulls. I think there may be a fewexceptions.
Though there is a relational theory which has is rigorously
consistent,
nulls are not part of the theory. Nulls are basically what
someone/somewhere
thought of as a convenient tool (which it is) but has no theoretical
underpinning and is dangerous. I use it because I feel that I have
enough
experience but perhaps I'll be stung one day.
It has been discussed on the list before that in Oracle that in Oracle
an
empty string and null are the same. However Postgres treats an empty
string
'' as an actual value and not as null.
I just happened to notice another difference recently between Oracle
and
Postgresql for the clause
WHERE 1 IN (1,2,NULL)
In Oracle, this clause is false because 1 compared to a NULL is false.
However, Postgresql will return a true. I actually don't know what theANSI
standard is for this case. Perhaps someone else on this list will
know.
Perhaps the standard body never even thought of this. Yes, I was
actually
stung by this particular while using it in Oracle.
Vincent Hikida,
Member of Technical Staff - Urbana Software, Inc.
"A Personalized Learning Experience"www.UrbanaSoft.com
----- Original Message -----
From: "Jean-Christian Imbeault" <jc@mega-bucks.co.jp>
To: <pgsql-general@postgresql.org>
Sent: Sunday, July 13, 2003 10:42 PM
Subject: [GENERAL] select null + 0 questionWhy is it that "select null + 1" gives null but "select sum(a) from
table" where there are null entries returns an integer?Shouldn't the sum() and "+" operators behave the same?
TAL=# select null + 0;
?column?
----------(1 row)
TAL=# select * from a;
a
---1
(3 rows)TAL=# select sum(a) from a;
sum
-----
1
(1 row)Thanks,
Jean-Christian Imbeault
---------------------------(end of
broadcast)---------------------------
Show quoted text
TIP 8: explain analyze is your friend
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster
OK. This has been bothering me. I finally recreated what I remember as an
anomoly in Oracle involving nulls. It also works the same way in PostgreSQL.
I guess in mind I extrapolated that there was a problem with "WHERE 1 IN
(1,2,NULL)" which there isn't.
The following is my query in 9i:
SQL> select 1 from dual where 2 not in (1,null);
no rows selected
The following is in PostgreSQL:
select 1 where 2 not in (1,null)
?column?
------------
(0 rows)
Of course this is just a simple test. The actual query that was being used
when we found the anomoly was more practical:
select ... from tablex where x.a not in (select y.a from tabley);
We finally did something like this to get what we wanted:
select .. from tablex where not exists (select null from tabley where y.a =
x.a);
Now that I think about it a little, SQL does make sense. We are sure that "1
is in (1,2,NULL)". However we cannot be sure that in 3 is not in (1,2, NULL)
because the NULL maybe 3 (if you interpret null as being unknown). However,
the SQL does not work if you have other interpretations of NULL (e.g. Null
means not applicable, Null means divide by 0).
Vincent Hikida,
Member of Technical Staff - Urbana Software, Inc.
"A Personalized Learning Experience"
www.UrbanaSoft.com
----- Original Message -----
From: "Csaba Nagy" <nagy@ecircle-ag.com>
To: "Vincent Hikida" <vhikida@inreach.com>
Cc: "Postgres general mailing list" <pgsql-general@postgresql.org>
Sent: Monday, July 14, 2003 1:50 AM
Subject: Re: Fw: [GENERAL] select null + 0 question
This was executed via sql+ on an Oracle 9i installation:
SQL> select 1 from dual where 1 in (1,2,null);
1
----------
1SQL> select 1 from dual where 1 in (null);
no rows selected
I would say the Oracle implementation is correct and the same as in
Postgres. For your problem I would check the other parts of the query.Cheers,
Csaba.On Mon, 2003-07-14 at 08:14, Vincent Hikida wrote:
Oops forgot to cc the list.
Unfortunately, intra-row functions using nulls return nulls. Inter-row
functions "usually" ignore the nulls. I think there may be a fewexceptions.
Though there is a relational theory which has is rigorously
consistent,
nulls are not part of the theory. Nulls are basically what
someone/somewhere
thought of as a convenient tool (which it is) but has no theoretical
underpinning and is dangerous. I use it because I feel that I have
enough
experience but perhaps I'll be stung one day.
It has been discussed on the list before that in Oracle that in Oracle
an
empty string and null are the same. However Postgres treats an empty
string
'' as an actual value and not as null.
I just happened to notice another difference recently between Oracle
and
Postgresql for the clause
WHERE 1 IN (1,2,NULL)
In Oracle, this clause is false because 1 compared to a NULL is false.
However, Postgresql will return a true. I actually don't know what theANSI
standard is for this case. Perhaps someone else on this list will
know.
Perhaps the standard body never even thought of this. Yes, I was
actually
stung by this particular while using it in Oracle.
Vincent Hikida,
Member of Technical Staff - Urbana Software, Inc.
"A Personalized Learning Experience"www.UrbanaSoft.com
----- Original Message -----
From: "Jean-Christian Imbeault" <jc@mega-bucks.co.jp>
To: <pgsql-general@postgresql.org>
Sent: Sunday, July 13, 2003 10:42 PM
Subject: [GENERAL] select null + 0 questionWhy is it that "select null + 1" gives null but "select sum(a) from
table" where there are null entries returns an integer?Shouldn't the sum() and "+" operators behave the same?
TAL=# select null + 0;
?column?
----------(1 row)
TAL=# select * from a;
a
---1
(3 rows)TAL=# select sum(a) from a;
sum
-----
1
(1 row)Thanks,
Jean-Christian Imbeault
---------------------------(end of
broadcast)---------------------------
Show quoted text
TIP 8: explain analyze is your friend
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings
On Tuesday 15 Jul 2003 7:38 pm, Vincent Hikida wrote:
OK. This has been bothering me. I finally recreated what I remember as an
anomoly in Oracle involving nulls. It also works the same way in
PostgreSQL. I guess in mind I extrapolated that there was a problem with
"WHERE 1 IN (1,2,NULL)" which there isn't.The following is my query in 9i:
SQL> select 1 from dual where 2 not in (1,null);
no rows selectedThe following is in PostgreSQL:
select 1 where 2 not in (1,null)
?column?
------------
(0 rows)
Now that I think about it a little, SQL does make sense. We are sure that
"1 is in (1,2,NULL)". However we cannot be sure that in 3 is not in (1,2,
NULL) because the NULL maybe 3 (if you interpret null as being unknown).
However, the SQL does not work if you have other interpretations of NULL
(e.g. Null means not applicable, Null means divide by 0).
You might like to look over:
http://techdocs.postgresql.org/guides/BriefGuideToNulls
It's my typing, but I got a lot of input from the list, so it's good stuff.
Sorry I didn't post this link earlier but I'm afraid I didn't look into your
thread until tonight.
--
Richard Huxton