sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo reutilizar el resultado para las cláusulas SELECT, WHERE y ORDER BY?

En el GROUP BY y ORDER BY puede hacer referencia a alias de columna (columnas de salida) o incluso a números ordinales de SELECT artículos de la lista. Cito el manual en ORDER BY :

Cada expresión puede ser el nombre o número ordinal de una columna de salida (elemento de lista SELECCIONAR) , o puede ser una expresión arbitraria formada a partir de los valores de la columna de entrada.

Énfasis en negrita mío.

Pero en el WHERE y HAVING cláusulas, solo puede hacer referencia a las columnas de las tablas base (columnas de entrada), por lo que debe deletrear su llamada de función.

SELECT *, earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
FROM   venues 
WHERE  earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) <= radius 
ORDER  BY distance;

Si quiere saber si es más rápido empaquetar el cálculo en un CTE o una subconsulta, simplemente pruébelo con EXPLAIN ANALYZE . (Lo dudo.)

SELECT *
FROM  (
   SELECT *
         ,earth_distance(ll_to_earth(62.0, 25.0), ll_to_earth(lat, lon)) AS dist
   FROM   venues
   ) x
WHERE  distance <= radius 
ORDER  BY distance;

Como comentó @Mike, declarando una función STABLE (o IMMUTABLE ) le informa al planificador de consultas que los resultados de una llamada de función se pueden reutilizar varias veces para llamadas idénticas dentro de una sola declaración. Cito el manual aquí:

Una función ESTABLE no puede modificar la base de datos y se garantiza que devolverá los mismos resultados dados los mismos argumentos para todas las filas dentro de una sola declaración. Esta categoría permite al optimizador optimizar varias llamadas de la función en una sola llamada .

Énfasis en negrita mío.