Search Postgresql Archives

Re: IN clause

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On fös, 2006-11-24 at 10:10 -0800, Richard Broersma Jr wrote:
> > That is fine 
> > but what I was actually expecting is this
> > if 
> > select * from table where col_name in (null, 'a', 'b');
> > 
> > to return those rows where col_name is null or if it = a or if it is = b
> >  
> > But i think in does not not support null queries , am i right?
> > 
> 
> that is correct: if col_name was actually 'a' then you would get:
> 
> 'a' in ( null, 'a', 'b', ...) works the same as:
> 
> 'a' = null  ~ resolves to Unknown
> or
> 'a' = 'a'   ~ resovles to true
> or
> 'a' = 'b'   ~ resovles to false
> or
> ...
> 
> so you end up with:
> (unknown or true or false) = true
> but if you have
> (unknown or false or false) = false

yes, except I think you meant:
(unknown or false or false) = unknown

as can be demonstrated by:

test=# \pset null 'null'
Null display is "null".
test=# select (null or true);
 ?column?
----------
 t
(1 row)

test=# select (null or false);
 ?column?
----------
 null
(1 row)


and indeed the IN operator does behave this way:

test=# select 'a' in (null,'a');
 ?column?
----------
 t
(1 row)

test=# select 'a' in (null,'b');
 ?column?
----------
 null
(1 row)

test=# select 'a' in ('a','b');
 ?column?
----------
 t
(1 row)

test=# select 'a' in ('b','c');
 ?column?
----------
 f
(1 row)


and finally: NULL IN (NULL,'b') will return NULL
because it will translate to
(NULL = NULL) or (NULL = 'b')

test=# select null in (null,'b');
 ?column?
----------
 null
(1 row)





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux