Thread: NULLs ;-)
> (Can we talk about NULL next? :P) Seriously though, there is one thing I've been meaning to bring up. I understand why NULLs compare the way they do in queries, and that's fine. But there are times when I need to query what would be described in relational terms as "not known to be equal", and where a <> b or (a is null and b is not null) or (a is not null and b is null) is rather clumsy and verbose (though precise), especially when it needs to be combined with other criteria. So, first, have I missed some way to express that more easily in PG? And if not, is there any reason not to request a new operator? (Perhaps "a nktbe b"? The C guy in me prefers "a != b" but that would be *FAR* too prone to confusion with <>.) -- Scott Ribe scott_ribe@killerbytes.com http://www.killerbytes.com/ (303) 722-0567 voice
On Nov 28, 2006, at 9:37 , Scott Ribe wrote: >> (Can we talk about NULL next? :P) > > Seriously though, there is one thing I've been meaning to bring up. I > understand why NULLs compare the way they do in queries, and that's > fine. > But there are times when I need to query what would be described in > relational terms as "not known to be equal", and > > where a <> b or (a is null and b is not null) or (a is not null > and b is > null) > So, first, have I missed some way to express that more easily in > PG? And if > not, is there any reason not to request a new operator? (Perhaps "a > nktbe > b"? The C guy in me prefers "a != b" but that would be *FAR* too > prone to > confusion with <>.) Check out IS DISTINCT FROM http://www.postgresql.org/docs/current/interactive/functions- comparison.html I think that will help you. Michael Glaesemann grzm seespotcode net
Scott Ribe <scott_ribe@killerbytes.com> writes: > But there are times when I need to query what would be described in > relational terms as "not known to be equal", and > where a <> b or (a is null and b is not null) or (a is not null and b is > null) IS DISTINCT FROM ? regards, tom lane
On Mon, 2006-11-27 at 17:37 -0700, Scott Ribe wrote: > > (Can we talk about NULL next? :P) Oh bring it on! :) Joshua D. Drake -- === The PostgreSQL Company: Command Prompt, Inc. === Sales/Support: +1.503.667.4564 || 24x7/Emergency: +1.800.492.2240 Providing the most comprehensive PostgreSQL solutions since 1997 http://www.commandprompt.com/ Donate to the PostgreSQL Project: http://www.postgresql.org/about/donate
> Check out IS DISTINCT FROM > > http://www.postgresql.org/docs/current/interactive/functions- > comparison.html > > I think that will help you. It's exactly what I was asking for. Well, except for the deja-vu feeling where I'm wondering if I didn't read that a long time ago and then forget it when I needed it. I didn't ask for that ;-) -- Scott Ribe scott_ribe@killerbytes.com http://www.killerbytes.com/ (303) 722-0567 voice
--- Scott Ribe <scott_ribe@killerbytes.com> wrote: > > (Can we talk about NULL next? :P) > > Seriously though, there is one thing I've been meaning to bring up. I > understand why NULLs compare the way they do in queries, and that's fine. > But there are times when I need to query what would be described in > relational terms as "not known to be equal", and > > where a <> b or (a is null and b is not null) or (a is not null and b is > null) > > is rather clumsy and verbose (though precise), especially when it needs to > be combined with other criteria. > > So, first, have I missed some way to express that more easily in PG? And if > not, is there any reason not to request a new operator? (Perhaps "a nktbe > b"? The C guy in me prefers "a != b" but that would be *FAR* too prone to > confusion with <>.) how about SELECT * FROM YOURTABLE where ( a = b ) IN UNKNOWN;
> how about > > SELECT * > FROM > YOURTABLE > where > ( a = b ) IN UNKNOWN; Well, actually, it would be: a = b or (a = b) is unknown But that certainly would more concise. -- Scott Ribe scott_ribe@killerbytes.com http://www.killerbytes.com/ (303) 722-0567 voice
Scott Ribe <scott_ribe@killerbytes.com> writes: > Well, actually, it would be: > a = b or (a = b) is unknown > But that certainly would more concise. But regression=# select (null = null) is unknown; ?column? ---------- t (1 row) which I think is not what you wanted. regards, tom lane
> But > > regression=# select (null = null) is unknown; > ?column? > ---------- > t > (1 row) > > which I think is not what you wanted. Right. -- Scott Ribe scott_ribe@killerbytes.com http://www.killerbytes.com/ (303) 722-0567 voice
Scott Ribe wrote: > where a <> b or (a is null and b is not null) or (a is not null and > b is null) In the absence of IS DISTINCT FROM, I think this has the same semantics: where coalesce(a, b) <> coalesce(b, a) although it's not as concise as one might wish. - John D. Burger MITRE
On þri, 2006-11-28 at 09:42 -0500, John D. Burger wrote: > Scott Ribe wrote: > > > where a <> b or (a is null and b is not null) or (a is not null and > > b is null) > > In the absence of IS DISTINCT FROM, I think this has the same semantics: > > where coalesce(a, b) <> coalesce(b, a) sorry, but no. test=# create table logic (a int, b int); CREATE TABLE test=# insert into logic values (null,null); INSERT 34495399 1 test=# insert into logic values (null,1); INSERT 34495400 1 test=# insert into logic values (1,null); INSERT 34495401 1 test=# insert into logic values (1,1); INSERT 34495402 1 test=# select a,b, coalesce(a, b) <> coalesce(b, a) as coal, a IS DISTINCT FROM b as dist from logic; a | b | coal | dist ---+---+------+------ | | | f | 1 | f | t 1 | | f | t 1 | 1 | f | f (4 rows) test=# gnari
>>> where a <> b or (a is null and b is not null) or (a is not null >>> and b is null) >> >> In the absence of IS DISTINCT FROM, I think this has the same >> semantics: >> >> where coalesce(a, b) <> coalesce(b, a) > > sorry, but no. Argh, my expression is just nonsense - I was thinking of something like: coalesce(a, 'SOME MAGIC VALUE') <> coalesce(b, 'SOME MAGIC VALUE') and wanted to make it work for any types. Sigh. - John D. Burger MITRE
>>> where a <> b or (a is null and b is not null) or (a is not null and >>> b is null) >> >> In the absence of IS DISTINCT FROM, I think this has the same semantics: >> >> where coalesce(a, b) <> coalesce(b, a) > > sorry, but no. So it would have to be where coalesce(a, b, 0) <> coalesce(b, a, 0) for your example with ints, and likewise some default value for other column types... -- Scott Ribe scott_ribe@killerbytes.com http://www.killerbytes.com/ (303) 722-0567 voice
On þri, 2006-11-28 at 12:28 -0700, Scott Ribe wrote: > >>> where a <> b or (a is null and b is not null) or (a is not null and > >>> b is null) > >> > >> In the absence of IS DISTINCT FROM, I think this has the same semantics: > >> > >> where coalesce(a, b) <> coalesce(b, a) > > > > sorry, but no. > > So it would have to be where coalesce(a, b, 0) <> coalesce(b, a, 0) for your > example with ints, and likewise some default value for other column types... no cigar. test=# select a,b, coalesce(a, b, 0) <> coalesce(b, a, 0) as john, a IS DISTINCT FROM b as dist from logic; a | b | john | dist ---+---+------+------ | | f | f | 1 | f | t 1 | | f | t 1 | 1 | f | f (4 rows) gnari
> no cigar. Well, duh. Showing why IS DISTINCT FROM is useful. -- Scott Ribe scott_ribe@killerbytes.com http://www.killerbytes.com/ (303) 722-0567 voice