PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Berechnete / berechnete / virtuelle / abgeleitete Spalten in PostgreSQL

Bis zu Postgres 11 generierte Spalten werden nicht unterstützt - wie im SQL-Standard definiert und von einigen RDBMS implementiert, einschließlich DB2, MySQL und Oracle. Auch nicht die ähnlichen "berechneten Spalten" von SQL Server.

STORED generierte Spalten werden mit Postgres 12 eingeführt . Triviales Beispiel:

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

db<>hier fummeln

VIRTUAL generierte Spalten können mit einer der nächsten Iterationen kommen. (Noch nicht in Postgres 14).

Verwandte:

  • Attributschreibweise für Funktionsaufruf gibt Fehler

Bis dahin , können Sie VIRTUAL emulieren generierte Spalten mit einer Funktion unter Verwendung der Attributschreibweise (tbl.col ), die ähnlich wie eine virtuell generierte Spalte aussieht und funktioniert . Das ist eine kleine Syntaxkuriosität, die in Postgres aus historischen Gründen existiert und zufällig in den Fall passt. Diese verwandte Antwort enthält Codebeispiele :

  • Allgemeine Abfrage als Spalte speichern?

Der Ausdruck (der wie eine Spalte aussieht) ist nicht in einem SELECT * FROM tbl enthalten , obwohl. Sie müssen es immer explizit angeben.

Kann auch mit einem passenden Ausdrucksindex unterstützt werden - vorausgesetzt, die Funktion ist IMMUTABLE . Wie:

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

Alternativen

Alternativ können Sie eine ähnliche Funktionalität mit einer VIEW implementieren , optional gekoppelt mit Ausdrucksindizes. Dann SELECT * kann die generierte Spalte enthalten.

"Bestanden" (STORED ) berechnete Spalten können auf funktional identische Weise mit Triggern implementiert werden.

Materialisierte Ansichten sind ein eng verwandtes Konzept, das seit Postgres 9.3 implementiert ist.
In früheren Versionen kann man MVs manuell verwalten.