Re: Duda con un select y alias

From: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
Cc: Jairo Graterón <jgrateron(at)gmail(dot)com>, Anthony Sotolongo <asotolongo(at)gmail(dot)com>, "Fontana Daniel C (Desartec S(dot)R(dot)L(dot))" <desartecsrl(at)gmail(dot)com>, Juan José Santamaría Flecha <juanjo(dot)santamaria(at)gmail(dot)com>, pgsql-es-ayuda <pgsql-es-ayuda(at)lists(dot)postgresql(dot)org>
Subject: Re: Duda con un select y alias
Date: 2020-09-08 13:42:17
Message-ID: CANm+PCBQP3oQ7WiqrY_ESi9wa6yZ_1r2JNM5Hwxx-m=GW+Hh=Q@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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 (<alvherre(at)2ndquadrant(dot)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
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2020-09-08 14:03:22 Re: Duda con un select y alias
Previous Message Diego 2020-09-07 21:44:11 Re: Extensión pldebugger para Postgresql 12 en Centos 7, no encontrada