在 Postgres 9.1中:
SELECT name, (f).* -- note the parentheses!
FROM (SELECT name, calculate_payments(id) AS f FROM person) sub;
假设您的函数具有明确定义的返回类型和列名(id, action, amount)
。并且您的函数总是返回与它相同id
的值(这是多余的并且可能会被优化)。
更详细的形式相同:
SELECT sub.id, sub.name, (sub.f).action, (sub.f).amount -- parentheses!
FROM (
SELECT p.id, p.name, calculate_payments(p.id) AS f(id, action, amount)
FROM person p
) sub;
列表中的集合返回函数SELECT
导致多行。但这是一个非标准且有些古怪的功能。pg 9.3+ 中的新LATERAL
功能更可取。
您可以在同一步骤中分解行类型:
SELECT *, (calculate_payments(p.id)).* -- parentheses!
FROM person p
但是由于 Postgres 查询计划器的弱点,这将对每个结果列评估一次函数:
或者在你的情况下:
SELECT p.id, p.name
, (calculate_payments(p.id)).action
, (calculate_payments(p.id)).amount
FROM person p
同样的问题:重复评估。
准确地说,相当于 pg 9.3+ 中的解决方案是这样的,在函数返回 0 行的结果中保留行:
SELECT p.id, p.name, f.action, f.amount
FROM person p
LEFT JOIN LATERAL calculate_payments(p.id) f ON true;
如果你不关心这个,你可以在 pg 9.3+ 中简化:
SELECT p.id, p.name, f.action, f.amount
FROM person p, calculate_payments(p.id) f;
密切相关: