Оператор не существует: integer = integer [] в запросе с ANY

Я часто использовал синтаксис integer = ANY(integer[]), но теперь ЛЮБОЙ оператор не работает. Это первый раз, когда я использую его для сравнения скаляра с целым числом, возвращаемым из CTE, но я думал, что это не должно вызывать проблем.

Мой запрос:

WITH bar AS (
  SELECT array_agg(b) AS bs
  FROM foo
  WHERE c < 3
)
SELECT a FROM foo WHERE b = ANY ( SELECT bs FROM bar);

Когда я запустил его, он выдает следующую ошибку:

ОШИБКА: оператор не существует: integer = integer []: WITH bar AS ( SELECT array_agg (b) AS bs FROM foo WHERE c < 3) SELECT a FROM foo WHERE b = ANY (SELECT bs FROM bar)

Подробности в SQL-скрипте.

Так что я делаю неправильно?

Ответ 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.

Ответ 2

Столбец

должен быть неактивным

С баром AS ( SELECT array_agg (b) AS bs FROM foo ГДЕ c < 3 ) Выберите FROM foo WHERE b = ANY (SELECT unsest (bs) FROM bar);

Ответ 3

без проблем

WITH bar AS (
  SELECT array_agg(b) AS bs
  FROM foo
  WHERE c < 3
)
SELECT a FROM foo WHERE ( SELECT b = ANY (bs) FROM bar);