PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Colonnes calculées / calculées / virtuelles / dérivées dans PostgreSQL

Jusqu'à Postgres 11 colonnes générées ne sont pas pris en charge - tels que définis dans la norme SQL et implémentés par certains RDBMS, notamment DB2, MySQL et Oracle. Ni les "colonnes calculées" similaires de SQL Server.

STORED les colonnes générées sont introduites avec Postgres 12 . Exemple trivial :

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

db<>jouez ici

VIRTUAL les colonnes générées peuvent venir avec l'une des prochaines itérations. (Pas encore dans Postgres 14).

Connexe :

  • La notation d'attribut pour l'appel de fonction génère une erreur

En attendant , vous pouvez émuler VIRTUAL colonnes générées avec une fonction en utilisant la notation d'attribut (tbl.col ) qui ressemble et fonctionne un peu comme une colonne générée virtuelle . C'est un peu une bizarrerie de syntaxe qui existe dans Postgres pour des raisons historiques et qui correspond au cas. Cette réponse connexe contient des exemples de code :

  • Stocker la requête courante sous forme de colonne ?

L'expression (ressemblant à une colonne) n'est pas incluse dans un SELECT * FROM tbl , mais. Vous devez toujours le lister explicitement.

Peut également être pris en charge avec un index d'expression correspondant - à condition que la fonction soit IMMUTABLE . Comme :

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

Alternatives

Alternativement, vous pouvez implémenter une fonctionnalité similaire avec un VIEW , éventuellement couplé à des index d'expression. Puis SELECT * peut inclure la colonne générée.

"Persistant" (STORED ) les colonnes calculées peuvent être implémentées avec des déclencheurs d'une manière fonctionnellement identique.

Les vues matérialisées sont un concept étroitement lié, implémenté depuis Postgres 9.3.
Dans les versions antérieures, il était possible de gérer les MV manuellement.