Обсуждение: arrays and subselects
Sorry to repeat myself, but I've gotten a couple improperly formed
digests which my mail reader couldn't decipher, and I'm afraid I
missed a response.
Am I supposed to be able to use the result of selecting an array as
the subquery for an 'in' clause? It seems very natural, and would
be mighty convenient.
For example:
create table testme1 (
key1 int2,
data1 int2[3]
);
create table testme2 (
key2 int2,
data2 int2
);
insert into testme1 values(1,'{1,2,3}');
insert into testme1 values(2,'{4,5,6}');
insert into testme2 values(10,5);
select key2 from testme2 where data2 in (select data1 from testme1
where key1 = 2);
Generates the following error
ERROR: Unable to identify an operator '=' for types 'int2' and '_int2'
You will have to retype this query using an explicit cast
Although I could name the array elements individually, this would be
most useful when the length of the array is variable.
I'd greatly appreciate any tips, pointers, or insight.
Thanks,
Dave
On Wed, 20 Sep 2000, Dave Hollenbeck wrote:
> insert into testme1 values(1,'{1,2,3}');
> insert into testme1 values(2,'{4,5,6}');
> insert into testme2 values(10,5);
>
> select key2 from testme2 where data2 in (select data1 from testme1
> where key1 = 2);
>
> Generates the following error
>
> ERROR: Unable to identify an operator '=' for types 'int2' and '_int2'
> You will have to retype this query using an explicit cast
>
> Although I could name the array elements individually, this would be
> most useful when the length of the array is variable.
I'd suggest looking at the array package in contrib which includes
functions/operators for element-in-array. Then you can use a simple
join or exists to do the query (also avoiding potential ugliness in using
in anyway).
The other option of course to make an int2=_int2 operator which is the
element-in-array, which would probably let you use the above syntax.
However, I'm not sure that's a good default. This is a problem with
arrays, are they data or are they a short form for rows of that value
type?