Eu tenho uma função assim no Postgres 9.5:
CREATE OR REPLACE FUNCTION my_func (p1 date, p2 integer, p3 integer, p4 integer) RETURNS
SETOF some_datum AS $func$
BEGIN
RETURN QUERY
with t as (
select p4, postcode, p1, rent * 12 * 100 / nullif(price, 0) as result
FROM crosstab (
$$
select postcode::text, indicator::int, value::float
from my_data
where (indicator = p2 or indicator = p3) and date = p1
order by 1,2
$$)
AS ct (
"postcode" text,
"price" float,
"rent" float)
)
select * from t where result is not null;
END
$func$ LANGUAGE plpgsql;
Quando carrego com PSQL
recebo o erro:
ERROR: column "p2" does not exist
LINE 4: where (indicator = p2 ...
^
QUERY:
select postcode::text, indicator::int, value::float
from my_data
where (indicator = p2 or indicator = p3) and date = p1
order by 1,2
Eu tentei prefixar o p2
etc com my_func.
, mas não funciona. Como posso me referir a um parâmetro de função nesse contexto?
Crosstab apenas vê uma string, então envie uma boa string.
Aliás, se você vai usar parâmetros nomeados, p1, p2, p3, etc são uma má ideia. Eles já estão
$1, $2, $2
. Eu sugeriria pelo menos algo um pouco mais fácil de seguir comoindicator1, indicator2