PostgreSQL prend-il en charge les colonnes calculées / calculées, comme MS SQL Server? Je ne trouve rien dans la documentation, mais comme cette fonctionnalité est incluse dans de nombreux autres SGBD, j'ai pensé qu'il me manquait peut-être quelque chose.
Par exemple: http://msdn.microsoft.com/en-us/library/ms191250.aspx
postgresql
calculated-columns
sql-view
materialized-views
generated-columns
Mike Chamberlain
la source
la source
Réponses:
Les colonnes générées jusqu'à Postgres 11 ne sont pas prises en charge - telles que définies dans la norme SQL et implémentées par certains SGBDR, 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:db <> violon ici
VIRTUAL
les colonnes générées peuvent être accompagnées de l'une des prochaines itérations. (Pas encore dans Postgres 13).En relation:
Jusque-là , vous pouvez émuler les
VIRTUAL
colonnes générées avec une fonction 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 convient parfaitement. Cette réponse associée contient des exemples de code :L'expression (qui ressemble à une colonne) n'est cependant pas incluse dans a
SELECT * FROM tbl
. 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:Alternatives
Vous pouvez également implémenter des fonctionnalités similaires avec un
VIEW
, éventuellement associé à des index d'expression. PuisSELECT *
peut inclure la colonne générée.Les
STORED
colonnes calculées "persistantes" ( ) 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.
la source
Oui, vous pouvez!! La solution doit être simple, sûre et performante ...
Je suis nouveau dans postgresql, mais il semble que vous puissiez créer des colonnes calculées en utilisant un index d'expression , associé à une vue (la vue est facultative, mais rend la vie un peu plus facile).
Supposons que mon calcul soit
md5(some_string_field)
, alors je crée l'index comme:Désormais, toutes les requêtes qui agissent
MD5(some_string_field)
utiliseront l'index plutôt que de le calculer à partir de zéro. Par exemple:Vous pouvez vérifier cela avec Expliquer .
Cependant, à ce stade, vous comptez sur les utilisateurs de la table sachant exactement comment construire la colonne. Pour vous simplifier la vie, vous pouvez créer un
VIEW
sur une version augmentée de la table d'origine, en ajoutant la valeur calculée en tant que nouvelle colonne:Désormais, toutes les requêtes utilisant
some_table_augmented
pourront être utiliséessome_string_field_md5
sans se soucier de son fonctionnement .. elles obtiennent juste de bonnes performances. La vue ne copie aucune donnée de la table d'origine, elle est donc bonne en termes de mémoire et de performances. Notez cependant que vous ne pouvez pas mettre à jour / insérer dans une vue, uniquement dans la table source, mais si vous le souhaitez vraiment, je pense que vous pouvez rediriger les insertions et les mises à jour vers la table source en utilisant des règles (je peux me tromper sur ce dernier point car Je ne l'ai jamais essayé moi-même).Edit: il semble que si la requête implique des index concurrents, le moteur de planification peut parfois ne pas utiliser du tout l'index d'expression. Le choix semble dépendre des données.
la source
if the query involves competing indices
?Une façon de faire est d'utiliser un déclencheur!
Le déclencheur est déclenché avant que la ligne ne soit mise à jour ou insérée. Il modifie le champ que nous voulons calculer d'
NEW
enregistrement, puis renvoie cet enregistrement.la source
insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
et il vient de revenir: 1 2 et 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
la valeur de latwo
colonne sera calculée automatiquement!PostgreSQL 12 prend en charge les colonnes générées:
démo db <> fiddle
la source
Eh bien, je ne sais pas si c'est ce que vous voulez dire, mais Posgres supporte normalement la syntaxe ETL "factice". J'ai créé une colonne vide dans le tableau, puis j'ai dû la remplir par des enregistrements calculés en fonction des valeurs de la ligne.
la source
J'ai un code qui fonctionne et utilise le terme calculé, je ne suis pas sur postgresSQL pur bien que nous courions sur PADB
voici comment il est utilisé
la source
Une solution légère avec contrainte Check:
la source
field as 1 persisted
.