Até 11 colunas geradas do Postgres não são suportados - conforme definido no padrão SQL e implementado por alguns RDBMS, incluindo DB2, MySQL e Oracle. Nem as "colunas calculadas" semelhantes do SQL Server.
STORED
colunas geradas são introduzidas com Postgres 12 . Exemplo trivial:CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
db<>mexa aqui
VIRTUAL
colunas geradas podem vir com uma das próximas iterações. (Não no Postgres 14, ainda). Relacionado:
- Notação de atributo para chamada de função dá erro
Até então , você pode emular
VIRTUAL
colunas geradas com uma função usando notação de atributo (tbl.col
) que parece e funciona muito como uma coluna gerada virtual . Isso é um pouco estranho de sintaxe que existe no Postgres por razões históricas e se encaixa no caso. Esta resposta relacionada tem exemplos de código :- Armazenar consulta comum como coluna?
A expressão (parecida com uma coluna) não está incluída em um
SELECT * FROM tbl
, no entanto. Você sempre tem que listá-lo explicitamente. Também pode ser suportado com um índice de expressão correspondente - desde que a função seja
IMMUTABLE
. Como:CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
Alternativas
Como alternativa, você pode implementar uma funcionalidade semelhante com um
VIEW
, opcionalmente acoplado a índices de expressão. Então SELECT *
pode incluir a coluna gerada. "Persistente" (
STORED
) colunas computadas podem ser implementadas com gatilhos de maneira funcionalmente idêntica. As visualizações materializadas são um conceito intimamente relacionado, implementado desde o Postgres 9.3.
Nas versões anteriores é possível gerenciar MVs manualmente.