Я часто использовал синтаксис integer = ANY(integer[])
, но теперь оператор ANY не работает. Это первый раз, когда я использую его для сравнения скаляра с целым числом, возвращаемым из CTE, но я думал, что это не должно вызывать проблем.Оператор не существует: integer = integer [] в запросе с ANY
Мой запрос:
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);
Когда я бегу, он бросает следующее сообщение об ошибке:
ERROR: operator does not exist: 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 Fiddle.
Так что я делаю неправильно?
Дополнительное объяснение, основанное на ваш ответ: Потому что '1 = ANY (ARRAY [1,2,3])' является законным, то разумно ожидать также '1 = ANY (SELECT ARRAY [1,2,3]) ', чтобы быть законным, но это не потому, что это создало бы двусмысленность относительно того, хотите ли вы' 1 = ARRAY [1,2,3] 'или' 1 = 1 OR 1 = 2 OR 1 = 3', и анализатор недостаточно умен, чтобы понять, что только один может быть законным. Вы можете сказать, что вам действительно нужна форма массива-ЛЮБОЙ с '1 = ЛЮБОЙ ((SELECT ARRAY [1,2,3]) :: int [])' (который я бы сделал вместо 'unsest'ing). –
Ах, интересно.Спасибо за дополнительную информацию. – khampson
@CraigRinger: спасибо! Ответ Кена помог мне, как это сделать правильно, но ваш комментарий заставил меня понять, почему мой запрос был неправильным. –