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

Beregnet / beregnet / virtuelle / afledte kolonner i PostgreSQL

Op til Postgres 11 genererede kolonner er ikke understøttet - som defineret i SQL-standarden og implementeret af nogle RDBMS, herunder DB2, MySQL og Oracle. Heller ikke de lignende "beregnede kolonner" af SQL Server.

STORED genererede kolonner introduceres med Postgres 12 . Trivielt eksempel:

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

db<>spil her

VIRTUAL genererede kolonner kan komme med en af ​​de næste iterationer. (Ikke i Postgres 14 endnu).

Relateret:

  • Attributnotation for funktionskald giver fejl

Indtil da , kan du efterligne VIRTUAL genererede kolonner med en funktion ved hjælp af attributnotation (tbl.col ), der ligner og fungerer meget som en virtuel genereret kolonne . Det er lidt af en syntaksmærkelighed, som eksisterer i Postgres af historiske årsager og tilfældigvis passer til sagen. Dette relaterede svar har kodeeksempler :

  • Vil du gemme almindelig forespørgsel som kolonne?

Udtrykket (som ligner en kolonne) er ikke inkluderet i en SELECT * FROM tbl , selvom. Du skal altid angive det eksplicit.

Kan også understøttes med et matchende udtryksindeks - forudsat at funktionen er IMMUTABLE . Ligesom:

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

Alternativer

Alternativt kan du implementere lignende funktionalitet med en VIEW , eventuelt kombineret med udtryksindekser. Derefter SELECT * kan inkludere den genererede kolonne.

"Vedvarende" (STORED ) beregnede kolonner kan implementeres med triggere på en funktionelt identisk måde.

Materialiserede visninger er et nært beslægtet koncept, implementeret siden Postgres 9.3.
I tidligere versioner kan man administrere MV'er manuelt.



  1. Sådan indsætter du data i tabellen ved hjælp af lagrede procedurer i postgresql

  2. [OPDATERET 2] Kritisk:Office Update bryder adgangen — Forespørgslen er korrupt

  3. SQL tæller alle rækker i stedet for at tælle individuelle rækker

  4. Træk datoer i Oracle - tal eller interval datatype?