sql >> Database >  >> RDS >> PostgreSQL

Berekende / berekende / virtuele / afgeleide kolommen in PostgreSQL

Tot Postgres 11 gegenereerde kolommen worden niet ondersteund - zoals gedefinieerd in de SQL-standaard en geïmplementeerd door sommige RDBMS, waaronder DB2, MySQL en Oracle. Noch de vergelijkbare "berekende kolommen" van SQL Server.

STORED gegenereerde kolommen worden geïntroduceerd met Postgres 12 . Triviaal voorbeeld:

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

db<>viool hier

VIRTUAL gegenereerde kolommen kunnen worden geleverd met een van de volgende iteraties. (Nog niet in Postgres 14).

Gerelateerd:

  • Kenmerknotatie voor functieaanroep geeft fout

Tot dan , kunt u VIRTUAL emuleren gegenereerde kolommen met een functie met behulp van kenmerknotatie (tbl.col ) die er lijkt op en werkt als een virtueel gegenereerde kolom . Dat is een beetje een eigenaardigheid van de syntaxis die om historische redenen in Postgres bestaat en toevallig in het geval past. Dit gerelateerde antwoord heeft codevoorbeelden :

  • Gemeenschappelijke zoekopdracht opslaan als kolom?

De uitdrukking (die eruitziet als een kolom) is niet opgenomen in een SELECT * FROM tbl , hoewel. Je moet het altijd expliciet vermelden.

Kan ook worden ondersteund met een overeenkomende expressie-index - op voorwaarde dat de functie IMMUTABLE is . Vind ik leuk:

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

Alternatieven

Als alternatief kunt u vergelijkbare functionaliteit implementeren met een VIEW , eventueel gekoppeld aan expressie-indexen. Dan SELECT * kan de gegenereerde kolom bevatten.

"Volhardde" (STORED ) berekende kolommen kunnen op een functioneel identieke manier worden geïmplementeerd met triggers.

Gematerialiseerde weergaven zijn een nauw verwant concept, geïmplementeerd sinds Postgres 9.3.
In eerdere versies kan men MV's handmatig beheren.



  1. Een API aanroepen vanuit de opgeslagen procedure van SQL Server

  2. Geef Dictionary<string,int> door aan de opgeslagen procedure T-SQL

  3. Nummers verwijderen van string sql-server

  4. Wijzigingsmelding met SQL Server 2008