Hasta Postgres 11 columnas generadas no son compatibles, tal como se define en el estándar SQL e implementado por algunos RDBMS, incluidos DB2, MySQL y Oracle. Ni las "columnas calculadas" similares de SQL Server.
STORED
las columnas generadas se introducen con Postgres 12 . Ejemplo trivial:
CREATE TABLE tbl (
int1 int
, int2 int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);
db<>violín aquí
VIRTUAL
las columnas generadas pueden venir con una de las próximas iteraciones. (No en Postgres 14, todavía).
Relacionado:
- La notación de atributo para la llamada de función da error
Hasta entonces , puedes emular VIRTUAL
columnas generadas con una función utilizando la notación de atributos (tbl.col
) que se ve y funciona como una columna virtual generada . Esa es una rareza de sintaxis que existe en Postgres por razones históricas y resulta que encaja en el caso. Esta respuesta relacionada tiene ejemplos de código :
- ¿Almacenar consulta común como columna?
La expresión (que parece una columna) no está incluida en un SELECT * FROM tbl
, aunque. Siempre tienes que enumerarlo explícitamente.
También se puede admitir con un índice de expresión coincidente, siempre que la función sea IMMUTABLE
. Me gusta:
CREATE FUNCTION col(tbl) ... AS ... -- your computed expression here
CREATE INDEX ON tbl(col(tbl));
Alternativas
Alternativamente, puede implementar una funcionalidad similar con VIEW
, opcionalmente junto con índices de expresión. Luego SELECT *
puede incluir la columna generada.
"Persistente" (STORED
) las columnas calculadas se pueden implementar con disparadores de una manera funcionalmente idéntica.
Las vistas materializadas son un concepto estrechamente relacionado, implementado desde Postgres 9.3.
En versiones anteriores, se pueden administrar los MV manualmente.