funciones español datos consultas consulta con complejas bases anidadas administración sql postgresql calculated-columns

español - funciones en postgresql



PostgreSQL: usando una columna calculada en la misma consulta (5)

Como regla general, hay dos cosas que debe saber sobre la cláusula SELECT :

  • Aunque se escribe primero , se evalúa en último lugar , con la excepción de la cláusula ORDER BY . Esta es la razón por la que no puede usar ningún campo o alias calculados en ninguna otra cláusula (especialmente la cláusula WHERE ), excepto en la cláusula ORDER BY .
  • Los cálculos en la cláusula SELECT se realizan en paralelo , o al menos se manejan como si lo fueran. Es por esto que no puedes usar un cálculo como parte de otro.

Entonces, la respuesta corta es que no puedes, y eso es por diseño.

La excepción notable a esto es Microsoft Access, donde de hecho puede usar cálculos en columnas subsiguientes y cláusulas WHERE . Sin embargo, aunque eso es conveniente, en realidad no es una ventaja: no seguir los principios anteriores es menos eficiente. Pero está bien para las bases de datos de tareas ligeras, que es para lo que se supone que se debe usar Access.

Si realmente desea reutilizar los resultados calculados, necesitará una consulta por separado, ya sea en forma de una subconsulta o como una expresión de tabla común. Los CTE son mucho más fáciles de trabajar, ya que son más claros de leer.

Editar

Sin cambiar el punto de la respuesta original, pensé que podría agregar que creo que esta explicación es posiblemente un poco mezquina.

Los DBMS modernos ponen mucho esfuerzo en la planificación y optimización de consultas, por lo que ya no es correcto, si es que alguna vez, que la consulta se ejecute realmente en un orden particular. Por lo que puedo ver, no hay ninguna razón técnica por la que el optimizador no pueda mirar hacia adelante e incorporar los resultados calculados en el análisis de la consulta, incluso si es solo para sustituir expresiones.

Oh bien …

Estoy teniendo problemas para usar una columna calculada en postgres. A continuación se proporciona un código similar que funciona en SQL. ¿Es posible recrear esto en PostgreSQL ?

select cost_1, quantity_1, cost_2, quantity_2, (cost_1 * quantity_1) as total_1, (cost_2 * quantity_2) as total_2, (calculated total_1 + calculated total_2) as total_3 from data;

En PostgreSQL un código similar devuelve el error que:

la columna total_1 y total_2 no existen.


Es necesario envolver la instrucción SELECT en una tabla derivada para poder acceder al alias de columna:

select cost1, quantity_1, cost_2, quantity_2 total_1 + total_2 as total_3 from ( select cost_1, quantity_1, cost_2, quantity_2, (cost_1 * quantity_1) as total_1, (cost_2 * quantity_2) as total_2 from data ) t

No habrá ninguna penalización de rendimiento en eso.

(Estoy realmente sorprendido de que su declaración SQL original se ejecute en un DBMS)


Estás intentando usar alias de columna en una expresión. Si un sistema te permite hacer eso, solo es azúcar sintáctica. Esto debería funcionar en cualquier dialecto SQL.

select cost_1 ,quantity_1 ,cost_2 ,quantity_2 ,cost_1 * quantity_1 as total_1 ,cost_2 * quantity_2 as total_2 ,(cost_1 * quantity_1) + (cost_2 * quantity_2) as total_3 from data;


Si no te gusta envolver toda la consulta con consulta externa, puedes usar LATERAL para calcular el total_1 intermedio y el total_2 :

SELECT cost_1, quantity_1, cost_2, quantity_2, total_1, total_2, total_1 + total_2 AS total_3 FROM data ,LATERAL(SELECT cost_1 * quantity_1, cost_2 * quantity_2) AS s1(total_1,total_2);

Demostración de DBFiddle

Salida:

╔═════════╦═════════════╦═════════╦═════════════╦══════════╦══════════╦═════════╗ ║ cost_1 ║ quantity_1 ║ cost_2 ║ quantity_2 ║ total_1 ║ total_2 ║ total_3 ║ ╠═════════╬═════════════╬═════════╬═════════════╬══════════╬══════════╬═════════╣ ║ 1 ║ 2 ║ 3 ║ 4 ║ 2 ║ 12 ║ 14 ║ ║ 3 ║ 5 ║ 7 ║ 9 ║ 15 ║ 63 ║ 78 ║ ║ 10 ║ 5 ║ 20 ║ 2 ║ 50 ║ 40 ║ 90 ║ ╚═════════╩═════════════╩═════════╩═════════════╩══════════╩══════════╩═════════╝


select cost_1, quantity_1, cost_2, quantity_2, cost_1 * quantity_1 as total_1, cost_2 * quantity_2 as total_2, (cost_1 * quantity_1 + cost_2 * quantity_2) as total_3 from data;