【问题标题】:Returning SETOF record loses record type when called from another query从另一个查询调用时,返回 SETOF 记录会丢失记录类型
【发布时间】:2020-03-02 21:39:36
【问题描述】:

我声明了一个 Postgres 函数,它从一个已经存在的表中返回一组记录。

create function foo_get(b bar)
returns setof foo as $$
  select foo.*
  from foo
  where foo.bar = b.id;
$$ language sql stable;

这是我编写的实际函数的简化,但按预期工作(它返回 foo 的所有列,用于我想要查找的所有记录)。

但是,如果我尝试以以下方式专门访问这些列,Postgres 会抱怨:

select wumbo.id from
(select foo(bar) from bar) as "wumbo";

这导致说 wumbo 没有 id 列,即使如果我只要求 select wumbo.* 而不是 select wumbo.idid 数据也会返回。

如果我在这里做一些违反范式的事情我很好(如果我这样做我并不感到惊讶),但我想了解原因。返回 setof foo 不等于返回我的 foo 表的完整架构吗? Postgres 是否将我返回的记录转换为没有列类型的匿名记录?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    您正在从具有单个匿名列的表中进行选择,该列包含 foo 记录。 wumbo 表确实没有 id 列。以下将起作用:

    select (wumbo.column).id
    from (select foo(bar) as column from bar) as wumbo;
    

    不过,我建议改用横向查询:

    select wumbo.id
    from bar, foo(bar) as "wumbo";
    

    【讨论】:

      猜你喜欢
      • 2014-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      相关资源
      最近更新 更多