Calculé / calculé / virtual / dérivés de colonnes dans PostgreSQL
N'support de PostgreSQL calculé /colonnes calculées, comme MS SQL Server? Je ne trouve rien dans la doc, mais comme cette fonctionnalité est incluse dans de nombreux autres Sgbd, j'ai pensé que j'ai peut-être raté quelque chose.
Par exemple: http://msdn.microsoft.com/en-us/library/ms191250.aspx
- À l'aide de la face latérale de la sous-requête expression (Postgres fonction), vous pouvez facilement ajouter d'autres colonnes pour chaque ligne.
Vous devez vous connecter pour publier un commentaire.
Jusqu'à Postgres 11 généré colonnes ne sont pas prises en charge telles que définies dans la norme SQL et mis en œuvre par certains SGBD: DB2, MySQL et Oracle. Ni le semblable "colonnes calculées" de SQL Server.
STORED
généré colonnes sont introduits avec Postgres 12. Exemple Trivial:db<>violon ici
VIRTUAL
généré des colonnes peut venir avec la prochaine itération. Connexes:Jusqu'alors, vous pouvez émuler
VIRTUAL
généré colonnes avec un fonction à l'aide de attribut notation (tbl.col
) que ressemble et fonctionne comme un virtuel généré colonne. C'est un peu une syntaxe bizarrerie qui existe dans Postgres pour des raisons historiques, et qui fit l'affaire. Cette réponse a exemples de code:L'expression (ressemblant à une colonne) n'est pas inclus dans un
SELECT * FROM tbl
, cependant. Vous avez toujours de liste explicitement.Peuvent également être pris en charge avec un correspondant l'expression de l'indice de - à condition que la fonction est
IMMUTABLE
. Comme:Alternatives
Alternativement, vous pouvez implémenter des fonctionnalités similaires avec un
VUE
, éventuellement couplé avec l'expression d'index. PuisSELECT *
peut inclure l'généré colonne."Persistantes" (
STORED
) les colonnes calculées peuvent être mis en œuvre avec les déclencheurs dans une fonctionnellement identiques.Les vues matérialisées sont étroitement liés concept, mis en œuvre depuis Postgresql 9.3.
Dans les versions antérieures, on peut gérer MVs manuellement.
OUI, vous pouvez!! La solution doit être facile, sûr, performant et...
Je suis nouveau sur postgresql, mais il semble que vous pouvez créer des colonnes calculées à l'aide d'un l'expression de l'indice de, jumelé avec un vue (la vue est facultatif, mais fait rend la vie un peu plus facile).
Suppose que mon calcul est
md5(some_string_field)
, puis-je créer l'index comme:Maintenant, toutes les requêtes qui agissent sur
MD5(some_string_field)
utilisera l'index plutôt que le calcul à partir de zéro. Par exemple:Vous pouvez le vérifier avec expliquer.
Toutefois, à ce stade, vous êtes en s'appuyant sur les utilisateurs de la table savoir exactement comment construire la colonne. Pour rendre la vie plus facile, vous pouvez créer un
VIEW
sur une version augmentée de la table d'origine, en ajoutant à la valeur calculée dans une nouvelle colonne:Maintenant toutes les requêtes à l'aide de
some_table_augmented
sera en mesure d'utilisersome_string_field_md5
sans se soucier de la façon dont il fonctionne..ils ont juste obtenir de bonnes performances. La vue n'est pas la copie de données à partir de la table d'origine, donc c'est une bonne mémoire-sage ainsi que de performance. Notez toutefois que vous ne pouvez pas mettre à jour/insérer une vue, uniquement dans la table source, mais si vous voulez vraiment, je crois que vous pouvez rediriger les insertions et mises à jour de la table source à l'aide de les règles (j'ai peut-être tort sur ce dernier point que je n'ai jamais essayé moi-même).Edit: il semble que si la requête implique des indices de compétition, l'organisateur de moteur peut parfois ne pas utiliser l'expression de l'index à tous. Le choix semble être données à charge.
if the query involves competing indices
?Une façon de le faire est avec un déclencheur!
Le trigger est déclenché avant que la ligne est insérée ou mis à jour. Il modifie le champ que nous voulons calculer de
NEW
enregistrer et ensuite, il retourne cet enregistrement.insert into computed values(1, 2); insert into computed values(4, 8); commit; select * from computed;
et il revient tout juste :1 2 4 8insert into computed(one) values(1); insert into computed(one) values(4); commit; select * from computed;
la valeur de latwo
colonne sera calculé automatiquement!PostgreSQL 12 prend en charge générée colonnes:
db<>le violon de démonstration
J'ai un code qui fonctionne et d'utiliser le terme calculé, je ne suis pas sur postgresSQL pur tho nous courons sur PADB
ici est de savoir comment il est utilisé
Bien, ne sais pas si c'est ce que Tu veux dire mais Posgres normalement soutien de "dummy" ETL syntaxe.
J'ai créé une colonne vide dans le tableau et le remplir par calculés dossiers selon les valeurs dans la ligne.
Une solution légère et avec la contrainte de Vérification:
field as 1 persisted
.