Прежде всего, ваш запрос кажется отключенным: нет Условие JOIN для таблиц a
и b
? Вы не хотите декартово произведение, не так ли? Попробуйте что-то вроде:
SELECT a.col1, b.col2
FROM a
JOIN b ON <some condition like b.a_id = a.a_id>
WHERE col1 = ANY($1);
Далее, используйте тип возврата для функции, чтобы вам не приходилось предоставлять список определений столбцов для каждого вызова. В примере я использую RETURNS TABLE
. Подробнее о читайте в руководстве .
Может выглядеть так:
CREATE FUNCTION myfunction(list_of_ids integer[])
RETURNS TABLE (
col1 text -- has to match the type of the column a.col1 that is returned.
,col2 text -- match type of a.col2
) AS
$$
SELECT a.col1, b.col2
FROM a
JOIN b ON <some condition like b.a_id = a.a_id>
WHERE col1 = ANY($1);
$$
LANGUAGE sql;
Одинарные кавычки вокруг 'sql' - просто шум. Может выступать в качестве ключевого слова.
Теперь вы можете позвонить:
SELECT * FROM myfunction('{11,23,6}'::integer[]);