Ответ 1
Основываясь на части сообщения об ошибке operator does not exist: integer = integer[]
, кажется, что столбец bs
должен быть unnest
ed, чтобы вернуть правую сторону к integer
, чтобы можно было найти оператор сравнения
WITH bar AS (
SELECT array_agg(b) AS bs
FROM foo
WHERE c < 3
)
SELECT a
FROM foo
WHERE b = ANY ( SELECT unnest(bs) FROM bar);
В результате получается результат:
A
2
3
Учитывая документ для ЛЮБОЙ функции:
Правая часть - это подзапрос в скобках, который должен возвращаться ровно один столбец. Левое выражение оценивается и сравнивается каждой строке результата подзапроса с использованием данного оператора, который должен приводить к булеву результату. Результат ANY является "истинным", если какой-либо истинный результат получается. Результатом является "false", если истинный результат не найден (включая случай, когда подзапрос не возвращает строк).
... ошибка имеет смысл, так как левое выражение представляет собой integer
- column b
- в то время как правое выражение представляет собой массив из integer
s или integer[]
, и поэтому сравнение заканчивается тем, что имеет вид integer
= integer[]
, который не имеет оператора и, следовательно, приводит к ошибке.
unnest
значение integer[]
делает левое и правое выражения integer
s, и поэтому сравнение может продолжаться.
Изменено SQL Fiddle.
Примечание:, что такое же поведение наблюдается при использовании IN
вместо = ANY
.