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)