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 >