sql >> Databasteknik >  >> RDS >> PostgreSQL

Beräknade / beräknade / virtuella / härledda kolumner i PostgreSQL

Upp till Postgres 11 genererade kolumner stöds inte - enligt definition i SQL-standarden och implementerad av vissa RDBMS inklusive DB2, MySQL och Oracle. Inte heller liknande "beräknade kolumner" av SQL Server.

STORED genererade kolumner introduceras med Postgres 12 . Trivialt exempel:

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

db<>spela här

VIRTUAL genererade kolumner kan komma med en av nästa iterationer. (Inte i Postgres 14 än).

Relaterat:

  • Attributnotation för funktionsanrop ger fel

Tills dess , kan du emulera VIRTUAL genererade kolumner med en funktion med attributnotation (tbl.col ) som ser ut och fungerar ungefär som en virtuellt genererad kolumn . Det är lite av en syntaxkonstighet som finns i Postgres av historiska skäl och som råkar passa fallet. Det här relaterade svaret har kodexempel :

  • Lagra vanlig fråga som kolumn?

Uttrycket (som ser ut som en kolumn) ingår inte i en SELECT * FROM tbl , fastän. Du måste alltid lista det explicit.

Kan även stödjas med ett matchande uttrycksindex - förutsatt att funktionen är IMMUTABLE . Gilla:

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

Alternativ

Alternativt kan du implementera liknande funktionalitet med en VIEW , valfritt i kombination med uttrycksindex. Sedan SELECT * kan inkludera den genererade kolumnen.

"Bestående" (STORED ) beräknade kolumner kan implementeras med triggers på ett funktionellt identiskt sätt.

Materialiserade vyer är ett närbesläktat koncept, implementerat sedan Postgres 9.3.
I tidigare versioner kan man hantera MVs manuellt.



  1. MySQL-serverstartfel "Servern avslutades utan att uppdatera PID-filen"

  2. Enkelt sätt att överföra kolumner och rader i SQL?

  3. SQLite JSON_QUOTE()

  4. IN vs OR för Oracle, vilket snabbare?