将多个 SELECT INTO 结果合并为一个变量

Posted

技术标签:

【中文标题】将多个 SELECT INTO 结果合并为一个变量【英文标题】:Combining multiple SELECT INTO results into one variable 【发布时间】:2014-07-31 18:02:06 【问题描述】:

我使用的方法可能效率不高(或可能),如果是这样,请告诉我。 我正在尝试使用SELECT INTO 选择两个值,然后将它们附加到一个变量(v1),该变量将由函数作为一个单元格返回。在两个SELECT INTO 语句之间插入UNION ALL 会导致ERROR: syntax error at or near "UNION"

EDIT - 该函数提供两个唯一值(非空),为这两个 SELECT INTO 语句指定

想要的输出:

    v1             v2      v3    etc.
2678, 2987         

功能摘录:

SELECT value
    INTO v1
    FROM table
    WHERE year <= parameteryear;

SELECT value
    INTO v1
    FROM table    
    WHERE yearinteger >= parameteryear;

data := v1;
RETURN NEXT;
END;
$$ LANGUAGE plpgsql;

【问题讨论】:

在 Postgres 中,select into 用于创建表,而不是为变量赋值。我不清楚你想要完成什么。 @GordonLinoffin PL/pgSQL select .. into 绝对用于将值放入变量中。 postgresql.org/docs/current/static/… 您希望 v1 是一个包含两个数字和它们之间的逗号的字符串? @Hogan 是的,这就是我希望输出的样子 缺少函数头,但它是不可或缺的重要部分。除其他外,我们需要查看v1 的实际类型,以及所有参数和声明的 RETURN 类型。还包括对您尝试使用该功能实现的目标的正确描述。可以肯定的是,我们还需要一个表定义(psql 中的\d tbl)。表中value可以为NULL吗? 【参考方案1】:
 SELECT cast(t1.value as varchar(20)) || ', ' || cast(t2.value as varchar(20))
     INTO v1
     FROM table as t1, table as t2
     WHERE t1.year <= parameteryear
       AND t2.yearinteger >= parameteryear;

【讨论】:

+ 不用于连接 SQL 中的字符串 谢谢,这样更紧凑,但我收到了ERROR: operator does not exist: character varying + unknown @interpost - 抱歉错误的平台。见上文——你想要|| 而不是+ @a_horse_with_no_name - 它在某些(其中一个是 SQL Server)中 在 86 || 中定义的 SQL 标准作为字符串连接字符,Postgres 符合该标准。【参考方案2】:

如果要使用联合所有查询,它必须在派生表中。

select value
into v1
from (union query goes here) derivedTable

【讨论】:

【参考方案3】:

每个单独的语句都是可疑,因为SELECT INTO 期望返回单行,但您的WHERE 条件似乎不能保证完全没有

将两者结合在一个语句中更加可疑,因为如果两者中的一个缺失或为 NULL 或不唯一,则会产生各种副作用。只有当这些并发症都不会发生时才有意义。我严重怀疑这一点。

如果你至少可以保证你得到两个条件的值,这将工作

SELECT concat_ws(',', t1.value, t2.value) 
INTO   v1
FROM   tbl t1, tbl t2
WHERE  t1.year <= parameteryear
AND    t2.yearinteger >= parameteryear;

但我几乎是肯定的,它并没有达到你想要的效果。 此外,从您的“期望输出”来看,您实际上可能需要一组 行。

简而言之:您呈现的片段根本没有任何意义。发布您的完整代码以及您实际尝试实现的目标。当然,还有一种不同的方法。

【讨论】:

是的,在收到 Hogan 的回答后,我意识到我过度简化了我发布的代码。发布整个函数可能会过分,但要添加您提到的缺失上下文,为这两个 SELECT INTO 语句指定了一个非空行。 @interpost:即便如此,也可能有更好的解决方案。但是,让我们把这个问题留在那里。

以上是关于将多个 SELECT INTO 结果合并为一个变量的主要内容,如果未能解决你的问题,请参考以下文章

“Into”语句可以将多个结果写入列类型变量吗?

MySQL存储过程中使用SELECT …INTO语句为变量赋值

PostgreSQL使用select into时有无STRICT关键字的区别

PostgreSQL使用select into时有无STRICT关键字的区别

select into 时有无strict关键字的区别

select into 时有无strict关键字的区别