sql >> Databáze >  >> RDS >> PostgreSQL

Uložit běžný dotaz jako sloupec?

Existuje způsob, jak uložit tento dílčí výběr jako pseudosloupec v tabulce?

VIEW jak bylo doporučeno, je to dokonale platné řešení. Jděte do toho.

Existuje však další způsob, který odpovídá vaší otázce ještě více. Můžete napsat funkci, která vezme typ tabulky jako parametr k emulaci "výpočtové pole" nebo "vygenerovaný sloupec" .

Zvažte tento testovací případ odvozený z vašeho popisu:

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);

Vytvořte funkci, která emuluje 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$;

Nyní můžete dotazovat:

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

Nebo dokonce:

SELECT *, a.col3 FROM tbl_a a;

Všimněte si, jak jsem napsal tbl_a.col3 / a.col3 , nejen col3 . To je nezbytné .

Na rozdíl od „virtuálního sloupce“ v Oracle ne zahrnuto automaticky v SELECT * FROM tbl_a . Můžete použít VIEW za to.

Proč to funguje?

Běžným způsobem odkazování na sloupec tabulky je zápis atributů :

SELECT tbl_a.col1 FROM tbl_a;

Běžným způsobem volání funkce je funkční zápis :

SELECT col3(tbl_a);

Obecně je nejlepší držet se těchto kanonických způsobů , které souhlasí se standardem SQL.

Postgres ale umožňuje i zápis atributů. Tyto fungují také:

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

Více o tom v manuálu.
Asi už vidíte, kam to směřuje. Toto vypadá jako byste přidali další sloupec tabulky tbl_a zatímco col3() je ve skutečnosti funkce, která přebírá aktuální řádek tbl_a (nebo jeho alias) jako argument typu řádku a vypočítá hodnotu.

SELECT *, a.col3
FROM   tbl_a AS a;

Pokud existuje skutečný sloupec col3 má prioritu a systém nehledá funkci tohoto jména na řádku tbl_a jako parametr.

Jeho „krása“:z tbl_a můžete přidávat nebo vypouštět sloupce a poslední dotaz dynamicky vrátí všechny aktuální sloupce, přičemž zobrazení by vrátilo pouze takové sloupce, které existovaly v době vytvoření (časná vazba vs. pozdní vazba * ).
Samozřejmě musíte zrušit závislou funkci, než budete moci zahodit tabulku. A při provádění změn v tabulce musíte dbát na to, abyste funkci nezrušili.

Stejně bych to nepoužil. Pro nevinného čtenáře je to příliš překvapivé.



  1. Jak age() funguje v PostgreSQL

  2. jak předat proměnnou ze skriptu shellu do sqlplus

  3. Dotazování více databází najednou

  4. 2. kvadrant Deutschland – speciální školení zahajovací smlouva