Ah buenísimo, yo entendí mal la pregunta entonces , planteo otra duda
similar:
Qué pasa si la función a llamar tiene parámetros que dependen de cada fila
de la consulta, por ejemplo :
create or replace function fn_test(x int) returns int
language plpgsql as
$$
begin raise notice 'buu!';
return x*4;
end
$$;

select fn_test(price::int),price
from products p2
where fn_test(price::int) > 6
limit 100;

en ese caso puedo hacer algo para llamar a la función una sola vez por cada
fila? solo se me ocurre un cálculo auxiliar con subconsulta a nivel de
from, pero termina siendo mas complejo para el motor que ejecutar dos veces
la función por cada fila :-)



El lun., 7 sept. 2020 a las 13:49, Alvaro Herrera (<alvhe...@2ndquadrant.com>)
escribió:

> Guillermo E. Villanueva escribió:
> > Creo que entiendo la duda de Daniel,  el quiere que por cada tupla del
> > resultado se llame una única vez a una función y a ese resultado poder
> > usarlo en mas de una proyección de columna y por ejemplo en el where y en
> > este caso con lo que indica Jairo no lo solucionaría.s
>
> Perdona que te contradiga, pero la solución de Jairo lo soluciona
> perfectamente.  Es fácil verlo haciendo que la función deje una traza en
> cada ejecución:
>
> =# create function f_articulo_get_precio(int) returns text language
> plpgsql as $$ begin raise notice 'buu!'; return '12342020/09/07'; end
> $$;
> CREATE FUNCTION
>
> por ejemplo, invocándola una vez vemos la traza:
>
> =# select f_articulo_get_precio(1234);
> NOTICE:  buu!
>  f_articulo_get_precio
> ───────────────────────
>  12342020/09/07
> (1 fila)
>
> y ahora ejecutamos como Jairo sugiere, la traza aparece una única vez:
>
> =# with T1 as
>    (select f_articulo_get_precio(1234) as ls_numero)
>    select substr(ls_numero, 8, 13), substr(ls_numero, 21, 10)
>    from t1 ;
> NOTICE:  buu!
>  substr  │ substr
> ─────────┼────────
>  0/09/07 │
> (1 fila)
>
>
> > (* tampoco lo puede resolver con lo que indica Anthony*)
>
> Dicho lo anterior, la solución de Anthony es la realmente inteligente.
>
> --
> Álvaro Herrera                https://www.2ndQuadrant.com/
> PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
>

Reply via email to