From: | David Fetter <david(at)fetter(dot)org> |
---|---|
To: | John R Pierce <pierce(at)hogranch(dot)com> |
Cc: | Thomas Kellerer <spam_eater(at)gmx(dot)net>, pgsql-general(at)postgresql(dot)org |
Subject: | Re: Using AND in query |
Date: | 2010-08-08 22:08:05 |
Message-ID: | 20100808220805.GD27785@fetter.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On Sun, Aug 08, 2010 at 12:33:40PM -0700, David Fetter wrote:
> On Sun, Aug 08, 2010 at 01:55:19AM -0700, John R Pierce wrote:
> > >The condition
> > >
> > > and table.item = 'laptop' and table.item = 'Desktop'
> > >
> > >says: I want all rows where the column item has the value
> > >'Laptop' and *at the same time* has the value 'Desktop' Which
> > >clearly cannot be the case (a column can only have a single
> > >value)
> > >
> > >So you need to join all "Laptop" rows to all "Desktop" rows to
> > >get what you want.
> >
> > why not use OR ?
> >
> > ... AND (table.item = 'laptop' OR table.item='Desktop') ...
>
> OR doesn't account for duplicates. Two laptops on the same date
> would cause a false positive.
Thinking this over a little more, it's probably fastest to combine the
approaches, i.e. use both a WHERE clause and a HAVING clause. For
example:
SELECT TID, "Date"
FROM "table"
WHERE item = ANY(ARRAY['Desktop','Laptop'])
GROUP BY TID, "Date"
HAVING ARRAY['Desktop','Laptop'] <@ array_agg(item);
Cheers,
David
--
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778 AIM: dfetter666 Yahoo!: dfetter
Skype: davidfetter XMPP: david(dot)fetter(at)gmail(dot)com
iCal: webcal://www.tripit.com/feed/ical/people/david74/tripit.ics
Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
From | Date | Subject | |
---|---|---|---|
Next Message | Scott Frankel | 2010-08-08 22:51:37 | Re: MySQL versus Postgres |
Previous Message | Glen Eustace | 2010-08-08 21:08:32 | Re: Accessing a database via AJAX scripts |