sql >> Databasteknik >  >> RDS >> PostgreSQL

Lagra vanlig fråga som kolumn?

Finns det något sätt att lagra det undervalet som en pseudo-kolumn i tabellen?

En VIEW som har rekommenderats är en helt giltig lösning. Gör det.

Men det finns ett annat sätt som passar din fråga ännu närmare. Du kan skriva en funktion som tar tabelltypen som parameter för att emulera ett "beräknat fält" eller "genererad kolumn" .

Tänk på detta testfall, härlett från din beskrivning:

CREATE TABLE tbl_a (a_id int, col1 int, col2 int);
INSERT INTO tbl_a VALUES (1,1,1), (2,2,2), (3,3,3), (4,4,4);

CREATE TABLE tbl_b (b_id int, a_id int, colx int);
INSERT INTO tbl_b VALUES
  (1,1,5),  (2,1,5),  (3,1,1)
, (4,2,8),  (5,2,8),  (6,2,6)
, (7,3,11), (8,3,11), (9,3,11);

Skapa funktion som emulerar col3 :

CREATE FUNCTION col3(tbl_a)
  RETURNS int8
  LANGUAGE sql STABLE AS
$func$
SELECT sum(colx)
FROM   tbl_b b
WHERE  b.a_id = $1.a_id
$func$;

Nu kan du fråga:

SELECT a_id, col1, col2, tbl_a.col3
FROM   tbl_a;

Eller till och med:

SELECT *, a.col3 FROM tbl_a a;

Notera hur jag skrev tbl_a.col3 / a.col3 , inte bara col3 . Detta är viktigt .

Till skillnad från en "virtuell kolumn" i Oracle är den inte ingår automatiskt i en SELECT * FROM tbl_a . Du kan använda en VIEW för det.

Varför fungerar det här?

Det vanliga sättet att referera till en tabellkolumn är med attributnotation :

SELECT tbl_a.col1 FROM tbl_a;

Det vanliga sättet att anropa en funktion är med funktionell notation :

SELECT col3(tbl_a);

I allmänhet är det bäst att hålla sig till dessa kanoniska sätt , som överensstämmer med SQL-standarden.

Men Postgres tillåter också attributnotation. Dessa fungerar också:

SELECT col1(tbl_a) FROM tbl_a;
SELECT tbl_a.col3;

Mer om det i manualen.
Du ser förmodligen vid det här laget vart det här är på väg. Detta utseende som du skulle lägga till en extra kolumn i tabellen tbl_a medan col3() är faktiskt en funktion som tar den aktuella raden av tbl_a (eller dess alias) som radtypargument och beräknar ett värde.

SELECT *, a.col3
FROM   tbl_a AS a;

Om det finns en faktisk kolumn col3 det har prioritet och systemet letar inte efter en funktion av det namnet som tar raden tbl_a som parameter.

"Skönheten" med det:du kan lägga till eller släppa kolumner från tbl_a och den sista frågan kommer dynamiskt att returnera alla aktuella kolumner, där en vy endast skulle returnera sådana kolumner som fanns vid skapandet (tidig bindning kontra sen bindning av * ).
Självklart måste du släppa beroendefunktionen innan du kan släppa tabellen nu. Och du måste se till att inte ogiltigförklara funktionen när du gör ändringar i tabellen.

Jag skulle fortfarande inte använda den. Det är för överraskande för den oskyldiga läsaren.



  1. Hur kan jag skicka någon http-förfrågan från postgresql-funktion eller trigger

  2. Förbättra partitionsunderhåll med inkrementell statistik

  3. Oracles datumjämförelse har gått sönder på grund av sommartid

  4. Kan inte installera PostgreSQL:Ett fel inträffade vid körning av Microsoft VC++ runtime installationsprogrammet på Windows XP