Fazendo operações e criando colunas virtuais no FROM do PostgreSQL
O PostgreSQL permite criar colunas após a definição do FROM.
SELECT *FROM tabela, coluna1 AS batata
Você pode chamar uma função para alterar a coluna (mas não pode fazer :
SELECT *FROM tabela, "-"(coluna1, coluna2) AS subtracao -- não pode fazer isso: -- coluna1 - coluna2 AS subtracao
O estranho é que é possível fazer isso:
SELECT *FROM tabela, "-"(coluna1 - coluna2, coluna3 - coluna4) AS batata
Você pode chamar uma coluna depois dela ser criada:
SELECT *FROM tabela, coluna1 AS batata, batata AS tuberculo, "-"(batata, tuberculo) AS subtracao
É posível chamar funções dentro do FROM do PostgreSQL, mas é preciso fazer um "hack".
CREATE OR REPLACE FUNCTION public." "(IN anyelement, OUT anyelement) RETURNS anyelement LANGUAGE 'sql' IMMUTABLE AS $BODY$ SELECT $1 $BODY$;
Testando:
WITH ab AS (SELECT 'a' AS "a", 'b' AS b ) SELECT a, b, c FROM ab, " "(ARRAY[1,2,3]) AS c ;
Referências
Documentação sobre Pseudo Types
https://www.postgresql.org/docs/current/datatype-pseudo.html
https://www.postgresql.org/docs/current/extend-type-system.html#EXTEND-TYPES-POLYMORPHIC