Re: [SQL] Oddities with NULL and GROUP BY

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'

In response to

Responses

Browse pgsql-hackers by date

  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)

Browse pgsql-sql by date

  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