Первая ошибка связана с тем, что PostgreSQL видит
num = ANY(SELECT array_agg(num) from test)
как форма
expression operator ANY (subquery)
вместо того, вы хотите:
expression operator ANY (array expression)
Как таковой, он пытается сравнить num
с любым ROW возвращено по подзапросу (который в вашем примере возвращает одну строку ARRAY[1,2]
), вместо каждого элемента массива (следовательно, вы получаете operator does not exist: integer = integer[]
). См. the documentation для более подробной информации.
Вторые ошибки просто исходит из того, что [0]
получает доступ к элементу integer[]
, и как таковой возвращает integer
. Поскольку правый операнд должен быть массивом (или подзапросом, но PostgreSQL его не видит), PostgreSQL возвращает ERROR: op ANY/ALL (array) requires array on right side
.
(В качестве альтернативы, массивы 1-based основаны на PostgreSQL, а не на основе 0).
Если вы уверены, что ваша функция всегда будет возвращать единственный массив, то вы можете просто заставить Postgre видеть SELECT array_agg(num) from test
как integer[]
:
SELECT * FROM test
WHERE num = ANY((SELECT array_agg(num) from test)::integer[]);
┌─────┐
│ num │
├─────┤
│ 1 │
│ 2 │
└─────┘
(2 rows)
Заметим, однако, что если ваша функция возвращает несколько массивов, вы получите сообщение об ошибке (поскольку setof integer[]
не может рассматриваться как integer[]
):
SELECT * FROM test
WHERE num = ANY((SELECT array_agg(num) from test GROUP BY num)::integer[]);
ERROR: 21000: more than one row returned by a subquery used as an expression
LOCATION: ExecSetParamPlan, nodeSubplan.c:970
Другим решением является использование функции unnest
, чтобы превратить ваш массив в набор целочисленных, используя expression operator ANY (subquery)
форму.Это будет работать, даже если ваша функция возвращает несколько массивов, хотя она немного медленнее предыдущего запроса.
SELECT *
FROM test
WHERE num = ANY(
SELECT unnest(sub.array_agg)
FROM (
SELECT array_agg(num) FROM test GROUP BY num -- GROUP BY num to show off the multiple array scenario
) AS sub
);
┌─────┐
│ num │
├─────┤
│ 1 │
│ 2 │
└─────┘
(2 rows)
Также будет работать простой 'where num = any (array (select num from test))'. –
Спасибо, это отличный ответ! Я сделал это с типом, потому что я уверен, что он возвращает только один массив, и теперь он работает. – sudo