From: | José Soares <jose(at)sferacarta(dot)com> |
---|---|
To: | secret <secret(at)kearneydev(dot)com> |
Cc: | "Jackson, DeJuan" <djackson(at)cpsgroup(dot)com>, PG-SQL <pgsql-sql(at)postgresql(dot)org> |
Subject: | Re: [SQL] Oddities with NULL and GROUP BY |
Date: | 1999-05-17 15:28:39 |
Message-ID: | 374035A7.F51806F@sferacarta.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers pgsql-sql |
secret ha scritto:
> "Jackson, DeJuan" wrote:
>
> > The behavior is valid, if you define NULL as meaning undefined.
> > In other words when you define something as NULL you're saying, "I don't
> > know what it is. It could be equal or not."
> > -DEJ
> >
> > > -----Original Message-----
> > > From: secret [SMTP:secret(at)kearneydev(dot)com]
> > > Sent: Friday, May 14, 1999 11:58 AM
> > > To: PG-SQL
> > > Subject: [SQL] Oddities with NULL and GROUP BY
> > >
> > > Maybe there is something I don't know about how GROUP BY should
> > > work, but if I have a table like:
> > > a,b,c
> > > 1,1,1
> > > 1,1,2
> > > 1,1,3
> > > 1,2,1
> > > 1,3,1
> > >
> > > And I say SELECT a,b,sum(c) FROm .. GROUP BY a,b I get
> > > 1,1,6
> > > 1,2,1
> > > 1,3,1
> > >
> > > So whenever a or b changes we get a new summed row, well if I have rows
> > > where a or b are null, this doesn't happen, infact I seem to get all
> > > those rows individually... Like if:
> > > 1,1,1
> > > 1,1,3
> > > 1,NULL,10
> > > 1,NULL,20
> > > 1,2,3
> > >
> > > I get:
> > > 1,1,4
> > > 1,NULL,10
> > > 1,NULL,20
> > > 1,2,3
> > >
> > > Shouldn't I get 1,NULL,30? Ie shouldn't NULL be treated like any other
> > > value? Or is there some bit of information I'm missing? I can set
> > > everything from NULL to 0 if need be, but I'd rather not...
> > >
> > > David Secret
> > > MIS Director
> > > Kearney Development Co., Inc.
> > >
>
> IBM's DB/2 Disagrees, so does Oracle8!
>
> Here is a cut & paste from Oracle SQL+:
>
> SQL> select * from z;
>
> A B
> --------- ---------
> 1 1
> 1 2
> 5
> 10
>
> SQL> select a,sum(b) from z group by a;
>
> A SUM(B)
> --------- ---------
> 1 3
> 15
>
> SQL>
>
> I'm going to report this as a bug now that I've verified 2 major database
> vendors perform the task as I would expect them to, and PostgreSQL does it
> very differently. The question is really is NULL=NULL, which I would say it
> should be.
I tried it in PostgreSQL 6.5beta1 with the same result:
select * from z;
a| b
-+--
1| 1
1| 2
| 5
|10
(4 rows)
select a,sum(b) from z group by a;
a|sum
-+---
1| 3
| 15
(2 rows)
The Pratical SQL Handbook at page 171 says:
Since nulls represent "the great unknown", there is no way to know
whether one null is equal to any other null. Each unknown value
may or may not be different from another.
However, if the grouping column contains more than one null,
all of them are put into a single group.
Thus: NULL!=NULL but on GROUP BY it is considered as NULL=NULL.
José
--
______________________________________________________________
PostgreSQL 6.5.0 on i586-pc-linux-gnu, compiled by gcc 2.7.2.3
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Jose'
From | Date | Subject | |
---|---|---|---|
Next Message | Oleg Bartunov | 1999-05-17 15:38:14 | Re: [HACKERS] GEQO optimizer (was Re: Backend message type 0x44 arrived while idle) |
Previous Message | Tom Lane | 1999-05-17 15:24:31 | Re: [HACKERS] GEQO optimizer (was Re: Backend message type 0x44 arrived while idle) |
From | Date | Subject | |
---|---|---|---|
Next Message | David Sauer | 1999-05-17 15:53:20 | is there any docs for new LOCK TABLE statement ? |
Previous Message | Mario Olimpio de Menezes | 1999-05-17 15:08:59 | Delete with AND |