Я не вижу в вашем вопросе ничего, что нельзя было бы решить с помощью:
SELECT a
FROM t
JOIN (VALUES (1), (2)) x(a) USING (a); -- any query returning multiple int
Можете ли вы прояснить необходимость в вашем примере?
В качестве доказательства концепции это будет проще / быстрее:
CREATE OR REPLACE FUNCTION x.f1()
RETURNS SETOF integer AS
$BODY$
BEGIN
RETURN QUERY EXECUTE '
SELECT a
FROM t
WHERE a = ANY($1)'
USING ARRAY(VALUES (1), (2)); -- any query here
END;
$BODY$
LANGUAGE plpgsql;
Производительность IN () и = ЛЮБОЙ ()
Ваше наблюдение точно. И этому есть причина. Попробуйте:
EXPLAIN ANALYZE SELECT * FROM tbl WHERE id IN (1,2,3);
План запроса покажет:
Индекс Cond: (id = ANY ('{1,2,3}' :: integer []))
PostgreSQL внутренне преобразует конструкцию id IN (..)
в id = ANY(..)
. Эти двое работают одинаково - за исключением незначительных накладных расходов.
Мой код быстрее строит оператор - точно так, как вы поставили диагноз.