Reputation: 131
The following returns "{3130,3135,2179,3186}", type "INTEGER[]":
SELECT
array_agg(c) AS c
FROM
(
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
) AS v
If I try to find the number "3186" by directly converting the text to an integer array, it works just fine:
SELECT 3186::INTEGER = ANY
(
'{3130,3135,2179,3186}'::INTEGER[]
)
But if I try doing the same with the result from the first query, I get an "operator does not exist: integer = integer[]" error message:
SELECT 3186::INTEGER = ANY
(
SELECT
array_agg(c) AS c
FROM
(
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
) AS v
)
What am I doing wrong?
I'm Using PostgreSQL 9.5.3, PgAdmin 1.22.1
Upvotes: 1
Views: 777
Reputation: 121889
There are two forms of ANY()
. In your query they are mixed.
If you want to use ANY (array expression):
SELECT 3130 = ANY(
ARRAY(
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
)
)
or
SELECT 3130 = ANY(array_agg(c))
FROM (
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
) alias
If you want to use ANY (subquery):
SELECT 3130 = ANY(
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
)
Upvotes: 2
Reputation: 176254
You could explicitly cast to INTEGER[]
:
SELECT 3186::INTEGER = ANY(
(
SELECT array_agg(c) AS c
FROM (
SELECT 3130::INTEGER AS c
UNION
SELECT 3135::INTEGER AS c
UNION
SELECT 2179::INTEGER AS c
UNION
SELECT 3186::INTEGER AS c
) AS v
)::INTEGER[]);
Upvotes: 1