PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment pouvez-vous développer une ligne PostgreSQL condensée en colonnes séparées ?

9.3 et supérieur :requête latérale

Dans PostgreSQL 9.3 ou plus récent, utilisez une requête latérale implicite :

SELECT f.* FROM things t, some_function(t.thing_id) f;

Préférez cette formulation pour toutes les nouvelles requêtes . Ce qui précède est la formulation standard .

Il fonctionne également correctement avec les fonctions qui RETURNS TABLE ou RETURNS SETOF RECORD ainsi que les funcs avec out-params qui RETURNS RECORD .

C'est un raccourci pour :

SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;

Pre-9.3 :extension générique (avec précaution)

Les versions précédentes provoquent une évaluation multiple de some_function , n'est-ce pas pas fonctionne si some_function renvoie un ensemble, ne l'utilisez pas :

SELECT (some_function(thing_id)).* FROM things;

Versions antérieures, évite l'évaluation multiple de some_function en utilisant une deuxième couche d'indirection. Utilisez-le uniquement si vous devez prendre en charge des versions assez anciennes de PostgreSQL.

SELECT (f).*
FROM (
  SELECT some_function(thing_id) f
  FROM things
) sub(f);

Démo :

Configuration :

CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
  RAISE NOTICE 'evaluated with %',i;
  x := i;
  y := i::text;
  z := 'dummy';
  RETURN;
END;
$$;

create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);

essai :

demo=>     SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>     SELECT (some_function(thing_id)).* FROM things;
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)

demo=>  SELECT (f).*
    FROM (
      SELECT some_function(thing_id) f
      FROM things
    ) sub(f);
NOTICE:  evaluated with 1
NOTICE:  evaluated with 2
NOTICE:  evaluated with 3
 x | y |   z   
---+---+-------
 1 | 1 | dummy
 2 | 2 | dummy
 3 | 3 | dummy
(3 rows)