在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列表中的集合返回函数导致多行。但这是一个非标准且有些古怪的功能。
LATERAL最好使用pg 9.3+中的新功能。
您 可以 在同一步骤中分解行类型:
SELECT *, (calculate_payments(p.id)).* -- parentheses!FROM person p
但是由于Postgres查询计划器的弱点,导致每列对该函数进行一次评估:
- 如何在SQL查询中使用(func())。*语法避免使用多个函数评估?
或您的情况:
SELECt p.id, p.name , (calculate_payments(p.id)).action , (calculate_payments(p.id)).amountFROM person p
同样的问题:多重评估。
确切地说,pg 9.3+中的解决方案的等效项是:
SELECt p.id, p.name, f.action, f.amountFROM person pLEFT JOIN LATERAL calculate_payments(p.id) f ON TRUE;
在函数返回0行的结果中保留行。
如果您对此不关心,则可以在9.3+版中进行简化:
SELECt p.id, p.name, f.action, f.amountFROM person p, calculate_payments(p.id) f;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)