从返回复合类型的 PostgreSQL 函数中选择
如何在 SELECT
中包含返回复合类型的函数?
我有复合类型:
CREATE TYPE public.dm_nameid AS (
id public.dm_int,
name public.dm_str
);
此外,我有一个返回此类型 fn_GetLinkedProject(integer)
的函数。 我需要做这样的事情:
SELECT
p.id, p.data, p.name,
pl.id linked_id, pl.name linked_name
FROM tb_projects p
left join "fn_GetLinkedProject"(p.id) pl
我该怎么做?
我已阅读这篇文章。
我不想要以下方法:
SELECT
p.id, p.data, p.name,
(select pl1.id from "fn_GetLinkedProject"(p.id) pl1 ) linked_id,
(select pl2.name from "fn_GetLinkedProject"(p.id) pl2 ) linked_name
FROM tb_projects p
How to include a function that returns a composite type in a SELECT
?
I have composite type:
CREATE TYPE public.dm_nameid AS (
id public.dm_int,
name public.dm_str
);
Also, I have a function that returns this type fn_GetLinkedProject(integer)
.
And I need to make something like this:
SELECT
p.id, p.data, p.name,
pl.id linked_id, pl.name linked_name
FROM tb_projects p
left join "fn_GetLinkedProject"(p.id) pl
How can I do this?
I have read this article.
I don't want following method:
SELECT
p.id, p.data, p.name,
(select pl1.id from "fn_GetLinkedProject"(p.id) pl1 ) linked_id,
(select pl2.name from "fn_GetLinkedProject"(p.id) pl2 ) linked_name
FROM tb_projects p
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Postgres 9.3 或更高版本
使用
LATERAL
加入!结果:
请参阅:
Postgres 9.2 或更旧的
Inferior 有几个原因。附加列别名并不那么简单。而是重命名其他冲突的名称:
结果:
要重命名结果列,您必须:
两个旧解决方案都解析为重复调用函数的相同(差!)查询计划 。
为了避免这种情况,请使用子查询:
注意必要的括号的位置。
阅读有关复合类型的手册。
演示
fiddle
Postgres 9.3 or newer
Use a
LATERAL
join!Result:
See:
Postgres 9.2 or older
Inferior for several reasons. Attaching column aliases is not as simple. Rather rename other conflicting names:
Result:
To rename the result columns, you have to:
Both old solutions resolve to the same (poor!) query plan of calling the function repeatedly.
To avoid that, use a subquery:
Note the placement of essential parentheses.
Read the manual about composite types.
Demo
fiddle