在Postgres :@H_403_1@
SELECT name, (f).* -- note the parentheses!
FROM (SELECT name, calculate_payments(id) AS f FROM person) sub;
您的函数具有定义明确的带有列名的返回类型(id, action, amount)
-问题中缺少信息。 还要假设您的函数始终返回与id
进给相同的函数(在这种情况下这是多余的,并且可能已经过优化)。@H_403_1@
同样 ,但更为冗长:@H_403_1@
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
列表中的集合返回函数导致多行。但这是一个非标准且有些古怪的功能。LATERAL
最好使用pg 9.3+中的新功能。@H_403_1@
您 可以 在同一步骤中分解行类型:@H_403_1@
SELECT *, (calculate_payments(p.id)).* -- parentheses!
FROM person p
但是由于Postgres查询计划器的弱点,导致每列对该函数进行一次评估:@H_403_1@
或您的情况:@H_403_1@
SELECT p.id, p.name
, (calculate_payments(p.id)).action
, (calculate_payments(p.id)).amount
FROM person p
同样的问题:多重评估。@H_403_1@
确切地说,pg 9.3+中的解决方案的等效项是:@H_403_1@
SELECT p.id, p.name, f.action, f.amount
FROM person p
LEFT JOIN LATERAL calculate_payments(p.id) f ON TRUE;
如果您对此不关心,则可以在9.3+版中进行简化:@H_403_1@
SELECT p.id, p.name, f.action, f.amount
FROM person p, calculate_payments(p.id) f;