PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Colonne calcolate/calcolate/virtuali/derivate in PostgreSQL

Fino a Postgres 11 colonne generate non sono supportati, come definito nello standard SQL e implementato da alcuni RDBMS inclusi DB2, MySQL e Oracle. Né le simili "colonne calcolate" di SQL Server.

STORED le colonne generate vengono introdotte con Postgres 12 . Esempio banale:

CREATE TABLE tbl (
  int1    int
, int2    int
, product bigint GENERATED ALWAYS AS (int1 * int2) STORED
);

db<>gioca qui

VIRTUAL le colonne generate possono venire con una delle successive iterazioni. (Non ancora in Postgres 14).

Correlati:

  • La notazione dell'attributo per la chiamata di funzione dà errore

Fino ad allora , puoi emulare VIRTUAL colonne generate con una funzione utilizzando la notazione degli attributi (tbl.col ) che sembra e funziona in modo molto simile a una colonna generata virtuale . Questa è una sorta di stranezza sintattica che esiste in Postgres per ragioni storiche e si adatta al caso. Questa risposta correlata contiene esempi di codice :

  • Memorizza query comune come colonna?

L'espressione (che assomiglia a una colonna) non è inclusa in un SELECT * FROM tbl , anche se. Devi sempre elencarlo in modo esplicito.

Può anche essere supportato con un indice di espressione corrispondente, a condizione che la funzione sia IMMUTABLE . Come:

CREATE FUNCTION col(tbl) ... AS ...  -- your computed expression here
CREATE INDEX ON tbl(col(tbl));

Alternative

In alternativa, puoi implementare funzionalità simili con un VIEW , facoltativamente accoppiato con indici di espressione. Quindi SELECT * può includere la colonna generata.

"Persistito" (STORED ) le colonne calcolate possono essere implementate con trigger in modo funzionalmente identico.

Le viste materializzate sono un concetto strettamente correlato, implementato da Postgres 9.3.
Nelle versioni precedenti è possibile gestire manualmente le MV.