Array comparison - subset

Started by Christopher Murtaghover 19 years ago5 messagesgeneral
Jump to latest
#1Christopher Murtagh
christopher.murtagh@gmail.com

Greetings folks,

I've got a function that returns and array $foo, and an array $bar.
Is there an elegant way to test if $bar is a subset of $foo? I've been
looking through the docs and haven't found anything. Am I missing
something obvious, or am I out of luck?

Cheers,

Chris

#2Michael Fuhr
mike@fuhr.org
In reply to: Christopher Murtagh (#1)
Re: Array comparison - subset

On Fri, Sep 01, 2006 at 11:55:32AM -0400, Christopher Murtagh wrote:

I've got a function that returns and array $foo, and an array $bar.
Is there an elegant way to test if $bar is a subset of $foo? I've been
looking through the docs and haven't found anything. Am I missing
something obvious, or am I out of luck?

In the specific case of integer arrays you could use contrib/intarray.

test=> SELECT ARRAY[1, 2, 3, 4] @ ARRAY[1, 3];
?column?
----------
t
(1 row)

test=> SELECT ARRAY[1, 2, 3, 4] @ ARRAY[1, 5];
?column?
----------
f
(1 row)

In 8.2 the above example will work in the stock installation for
arrays of any type (i.e., with operands of type anyarray).

--
Michael Fuhr

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Michael Fuhr (#2)
Re: Array comparison - subset

Michael Fuhr <mike@fuhr.org> writes:

test=> SELECT ARRAY[1, 2, 3, 4] @ ARRAY[1, 3];
?column?
----------
t
(1 row)

In 8.2 the above example will work in the stock installation for
arrays of any type (i.e., with operands of type anyarray).

[ blink... ] When did that get in, and why don't I see it in the
documentation? The operand order seems exactly backward considering
that all the pre-existing @ operators are "contained in", not
"contains". Should we flip this around before it's too late?

regards, tom lane

#4Michael Fuhr
mike@fuhr.org
In reply to: Tom Lane (#3)
Re: Array comparison - subset

On Sun, Sep 03, 2006 at 12:59:08AM -0400, Tom Lane wrote:

Michael Fuhr <mike@fuhr.org> writes:

test=> SELECT ARRAY[1, 2, 3, 4] @ ARRAY[1, 3];
?column?
----------
t
(1 row)

In 8.2 the above example will work in the stock installation for
arrays of any type (i.e., with operands of type anyarray).

[ blink... ] When did that get in, and why don't I see it in the
documentation?

Looks like it arrived with the gin code.

http://archives.postgresql.org/pgsql-committers/2006-05/msg00007.php
http://developer.postgresql.org/cvsweb.cgi/pgsql/src/include/catalog/pg_operator.h.diff?r1=1.142&amp;r2=1.143

The operand order seems exactly backward considering
that all the pre-existing @ operators are "contained in", not
"contains". Should we flip this around before it's too late?

I'd favor consistency, although I see that contrib/intarray has had
it backwards for a long time :-(

--
Michael Fuhr

#5Christopher Murtagh
christopher.murtagh@gmail.com
In reply to: Michael Fuhr (#2)
Re: Array comparison - subset

On 9/3/06, Michael Fuhr <mike@fuhr.org> wrote:

On Fri, Sep 01, 2006 at 11:55:32AM -0400, Christopher Murtagh wrote:

I've got a function that returns and array $foo, and an array $bar.
Is there an elegant way to test if $bar is a subset of $foo? I've been
looking through the docs and haven't found anything. Am I missing
something obvious, or am I out of luck?

In the specific case of integer arrays you could use contrib/intarray.

Cool. This is exactly what I needed. Thanks a bunch!

Cheers,

Chris