【问题标题】:PostgreSQL: Why can't subqueries as expressions return more than one row, but functions can?PostgreSQL:为什么作为表达式的子查询不能返回多于一行,但函数可以?
【发布时间】:2010-09-16 15:53:26
【问题描述】:

如果我尝试创建一个列,其值是一个返回多行的选择,我会收到错误。

=> select (select 1 union select 2);
ERROR:  more than one row returned by a subquery used as an expression

但如果我创建一个执行相同操作的函数,我会得到我想要的行为。

=> create or replace function onetwo() returns setof integer as $$
$> select 1 union select 2 
$> $$ language 'sql' strict immutable;
CREATE FUNCTION
=> select onetwo();
 onetwo 
--------
      1
      2

为什么不一样?

【问题讨论】:

    标签: sql postgresql function subquery


    【解决方案1】:

    这不是苹果对苹果的比较。

    select * 
      FROM (select 1 
            union ALL 
            select 2)
    

    ...等价于你的函数。

    SELECT 子句中的列每条记录只能返回一个值。对于您的 UNION 示例,这是不可能的。所以我将它转换为派生表/内联视图,这就是函数示例所发生的事情。

    【讨论】:

      【解决方案2】:

      虽然 OMG Ponies 的回答完全正确,但我宁愿这样说:您将 SELECT f()SELECT literal 混淆了。

      • SELECT f()执行一个函数并返回其结果。而且,一个返回表的函数也可以写成SELECT * FROM f()——更加优雅。因为 Pg 还没有存储过程——更少的调度可以通过函数来​​完成——我们使用 SELECT,就像 Microsoft SQL 使用 EXECUTE

      • SELECT LITERAL 是一种返回文字的方法(可以放在行/列中的内容)。

      【讨论】:

      • +1,我想我已经看到SELECT f()(用于设置返回函数f)形式被描述为SELECT * FROM f()的语法糖。之所以实施它只是因为它是明确且方便的简写。
      猜你喜欢
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2013-05-24
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多