9.3 и по-горе:странично запитване
В PostgreSQL 9.3 или по-нова използвайте имплицитна странична заявка:
SELECT f.* FROM things t, some_function(t.thing_id) f;
Предпочитайте тази формулировка за всички нови заявки . Горното е стандартната формула .
Освен това работи правилно с функции, които RETURNS TABLE
или RETURNS SETOF RECORD
както и функции с изходящи параметри, които RETURNS RECORD
.
Това е съкращение за:
SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;
Преди 9.3:разширение със заместващи знаци (внимателно)
Предишни версии, причинява многократна оценка на some_function
, не работи, ако some_function
връща набор, не използвайте това :
SELECT (some_function(thing_id)).* FROM things;
Предишни версии, избягва многократно оценяване на some_function
използвайки втори слой индиректност. Използвайте това само ако трябва да поддържате доста стари версии на PostgreSQL.
SELECT (f).*
FROM (
SELECT some_function(thing_id) f
FROM things
) sub(f);
Демо:
Настройка:
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);
тестово изпълнение:
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)