Thread: Can't get the field = ANY(array) clause to work...

Can't get the field = ANY(array) clause to work...

From
nboutelier@hotmail.com
Date:
Has anyone successfully used the "ANY", "ALL", or "SOME" clause using
arrays? Cant seem to get this to work. Heres the gist of my function
which returns a SETOF INTEGER[]...

DECLARE
  id_var INTEGER[];
  record_var RECORD;
BEGIN
  id_var[0] := 1;
  id_var[1] := 2;
  id_var[2] := 3;
  FOR record_var IN
    SELECT id FROM myTable WHERE id = ANY(id_var)
  LOOP
    RETURN NEXT record_var.id;
  END LOOP;
  RETURN;
END;

I get an empty record set! Any help would be appreciated. Thanks! -Nick


Re: Can't get the field = ANY(array) clause to work...

From
Richard Huxton
Date:
nboutelier@hotmail.com wrote:
> Has anyone successfully used the "ANY", "ALL", or "SOME" clause using
> arrays? Cant seem to get this to work. Heres the gist of my function
> which returns a SETOF INTEGER[]...
>
> DECLARE
>   id_var INTEGER[];
>   record_var RECORD;
> BEGIN
>   id_var[0] := 1;

I think by default arrays count from 1.

>   id_var[1] := 2;
>   id_var[2] := 3;
>   FOR record_var IN
>     SELECT id FROM myTable WHERE id = ANY(id_var)
>   LOOP
>     RETURN NEXT record_var.id;
>   END LOOP;
>   RETURN;
> END;
>
> I get an empty record set! Any help would be appreciated.

Well, the basic operation works OK here, so I'd check that "id_var"
contains what you think it does...

RAISE NOTICE ''id_var = %'', id_var;


richardh=> SELECT * FROM foo;
  a | b | c
---+---+---
  1 | 0 | 0
  0 | 1 | 0
  2 | 0 | 0
(3 rows)

richardh=> SELECT * FROM bar;
    y
-------
  {1,2}
(1 row)

richardh=> SELECT foo.* FROM foo, bar WHERE a = ANY(y);
  a | b | c
---+---+---
  1 | 0 | 0
  2 | 0 | 0
(2 rows)

--
   Richard Huxton
   Archonet Ltd

Re: Can't get the field = ANY(array) clause to work...

From
Tom Lane
Date:
nboutelier@hotmail.com writes:
> Has anyone successfully used the "ANY", "ALL", or "SOME" clause using
> arrays? Cant seem to get this to work. Heres the gist of my function
> which returns a SETOF INTEGER[]...

Works for me, modulo the fact that the code is evidently returning
setof int not setof int[].  What PG version are you using?

Welcome to psql 8.1.2, the PostgreSQL interactive terminal.
...
regression=# create table mytable(id int);
CREATE TABLE
regression=# insert into mytable values(1);
INSERT 0 1
regression=# insert into mytable values(2);
INSERT 0 1
regression=# insert into mytable values(4);
INSERT 0 1
regression=# create function foo() returns setof int as $$
regression$# DECLARE
regression$#   id_var INTEGER[];
regression$#   record_var RECORD;
regression$# BEGIN
regression$#   id_var[0] := 1;
regression$#   id_var[1] := 2;
regression$#   id_var[2] := 3;
regression$#   FOR record_var IN
regression$#     SELECT id FROM myTable WHERE id = ANY(id_var)
regression$#   LOOP
regression$#     RETURN NEXT record_var.id;
regression$#   END LOOP;
regression$#   RETURN;
regression$# END;
regression$# $$ language plpgsql;
CREATE FUNCTION
regression=# select * from foo();
 foo
-----
   1
   2
(2 rows)

regression=#

            regards, tom lane

Re: Can't get the field = ANY(array) clause to work...

From
nboutelier@hotmail.com
Date:
I set the array count to start at 1, but still not working. Im using
v8. Ive also read that the ANY clause runs rediculously slow. Is there
another way to convert an array into a record set without writing a
separate function for that? Is it even possible to create a record set
variable in a function? -Nick


Re: Can't get the field = ANY(array) clause to work...

From
nboutelier@hotmail.com
Date:
The problem was fixed by initializing the array before giving it a
value. Not surprising Postges isnt as popular as it should be. I was by
luck that I found this out - the manual says nothing about init arrays.

DECLARE
  id_var INTEGER[];
  record_var RECORD;
BEGIN
  id_var := '{}';
  id_var[0] := 1;
  id_var[1] := 2;
  id_var[2] := 3;
  FOR record_var IN
    SELECT id FROM myTable WHERE id = ANY(id_var)
  LOOP
    RETURN NEXT record_var.id;
  END LOOP;
  RETURN;
END;


Re: Can't get the field = ANY(array) clause to work...

From
Bricklen Anderson
Date:
nboutelier@hotmail.com wrote:
> The problem was fixed by initializing the array before giving it a
> value. Not surprising Postges isnt as popular as it should be. I was by
> luck that I found this out - the manual says nothing about init arrays.

Instead of flippant comments like that, submit docs a patch if you feel
it's necessary.

Re: Can't get the field = ANY(array) clause to work...

From
Stephan Szabo
Date:
On Thu, 2 Feb 2006 nboutelier@hotmail.com wrote:

> The problem was fixed by initializing the array before giving it a
> value. Not surprising Postges isnt as popular as it should be. I was by
> luck that I found this out - the manual says nothing about init arrays.

Well, I think that's in part because it got changed because it seemed like
bad behavior (it looks like the array without the initialization should
work in versions past 8.0.2, and it definately does on my reasonably
recent checkout).