将多个 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 结果合并为一个变量的主要内容,如果未能解决你的问题,请参考以下文章
MySQL存储过程中使用SELECT …INTO语句为变量赋值
PostgreSQL使用select into时有无STRICT关键字的区别