Re: Duda con un select y alias

From: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
To: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(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 14:03:22
Message-ID: 20200908140322.GA9652@alvherre.pgsql
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Guillermo E. Villanueva escribió:

> 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 :-)

Puedes usar una subconsulta con una "barrera de optimización". Primero
pones la subconsulta, que da esto:

select fn, price
from (select fn_test(price) as fn, price from products) AS sc
where fn > 6
LIMIT 100;

Pero eso puede no darte el resultado que quieres porque el optimizador
"aplana" la subconsulta convirtiéndola en parte de la consulta externa,
o sea que los "fn" de la consulta externa igual se convierten en la
invocación de fn_test(price). Para evitar eso agregas una barrera de
optimización que es OFFSET 0:

select fn, price
from (select fn_test(price) as fn, price from products OFFSET 0) AS sc
where fn > 6
LIMIT 100;

Eso le quita libertad al optimizador.

--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Martín Díaz 2020-09-08 15:48:02 Re: problema con barman y rsync
Previous Message Guillermo E. Villanueva 2020-09-08 13:42:17 Re: Duda con un select y alias