sql >> Database teknologi >  >> RDS >> PostgreSQL

Vælg fra PostgreSQL-funktion, der returnerer sammensat type

Postgres 9.3 eller nyere

Brug en LATERAL deltag!

VÆLG p.id, p.name, p.data, f.*FROM tb_projects PLEFT JOIN LATERAL fn_getlinkedproject(p.id) f(linked_id, lined_name) ON TRUE; 

Resultat:

id | data | navn | linked_id | linked_name----+--------+--------+-----------+------------- 1 | data_1 | navn_1 | 2 | navn_2 2 | data_2 | navn_2 | 3 | navn_3 3 | data_3 | navn_3 | 1 | navn_1

Se:

Postgres 9.2 eller ældre

Underlegen af ​​flere grunde. Det er ikke så nemt at vedhæfte kolonnealiaser. Omdøb hellere andre modstridende navne:

VÆLG p.id AS p_id, p.data AS p_data, p.name AS p_name, (fn_getlinkedproject(p.id)).*FROM tb_projects p; 

Resultat:

p_id | p_data | p_navn | id | navn------+--------+--------+----+-------- 1 | data_1 | navn_1 | 2 | navn_2 2 | data_2 | navn_2 | 3 | navn_3 3 | data_3 | navn_3 | 1 | navn_1

At omdøbe resultatkolonnerne, skal du:

VÆLG p.id, p.data, p.name ,(fn_getlinkedproject(p.id)).id AS linked_id ,(fn_getlinkedproject(p.id)).navn AS linked_nameFROM tb_projects p; 

Begge gamle løsninger løser den samme (dårlige) forespørgselsplan med at kalde funktionen gentagne gange.

For at undgå det, brug en underforespørgsel:

SELECT p.id, p.data, p.name , (p.x).id AS linked_id, (p.x).name AS linked_nameFROM (SELECT *, fn_getlinkedproject(id) AS x FROM tb_projects) p; 

Bemærk placeringen af ​​væsentlige parenteser .
Læs manualen om sammensatte typer .

Demo

CREATE TYPE dm_nameid AS (id int, navnetekst); -- typer forenklet for demoCREATE TABLE tb_projects( id int, datatekst, navnetekst);INSERT INTO tb_projects VALUES (1, 'data_1', 'name_1'), (2, 'data_2', 'name_2'), (3, 'data_3', 'name_3'); CREATE funktion fn_getlinkedproject(integer) -- undgår CaMeL-case for demo RETURNS dm_nameid LANGUAGE sql AS'SELECT id, name FROM tb_projects WHERE id =($1 % 3) + 1'; 

db<>fiddle her




  1. rails mysql adapter fejl

  2. Hvorfor opretter postgres ikke databasen?

  3. Hvordan simulerer man 32-bit signeret heltalsoverløb i PL/SQL?

  4. Sådan kontrolleres dato for sidste ændring i lagret procedure eller funktion i SQL-server