选择多行作为数组
Posted
技术标签:
【中文标题】选择多行作为数组【英文标题】:Select multiple rows as array 【发布时间】:2012-11-09 16:30:49 【问题描述】:我有一个表,其中两个人可能有相同的名字,但有不同的 ID。我得到了这个名字,并且需要请求他们的 ID。
当我使用如下命令时:
SELECT id_num INTO cust_id FROM Customers WHERE name=CName;
如果我在命令行 (psql) 上使用此命令,它会返回 2 个结果(例如)。
但是当我将它用作 SQL 脚本 (PL/pgSQL) 的一部分时,它总是只抓取第一个实例。
我尝试选择cust_id[]
,但这产生了错误。那么选择所有结果并将它们泵入数组的正确方法是什么?还是另一种简单的使用方法?
【问题讨论】:
plpgsql中有使用数组的例子***.com/questions/11731481/… 数组的替代方案可能是循环?有没有办法指定获取“下一个”结果? 【参考方案1】:在声明中
DECLARE id_nums bigint[];
在选择中
id_nums := ARRAY(select cust_id from Customers WHERE name = CName);
如果你喜欢循环使用
DECLARE id_num bigint;
FOR id_num in select cust_id from Customers WHERE name = CName LOOP
your code here
END LOOP;
在 postgresql 文档9.1 中阅读 plpgsql 控制结构。
【讨论】:
您能否就 Loop 版本提供更多解释? id_num 是我自己的变量,cust_id 是客户中的一列。我收到一个错误,“数组值必须以“”或维度信息开头。上下文指向 FOR select 语句。 完美,这就是我将 id_nums 定义为数组的问题。我很欣赏详尽且易于阅读的回复!FOR
循环看起来不错,但 SELECT INTO
示例与问题中的示例一样失败。
@ErwinBrandstetter 你说得对,我之前没有测试过。更正答案。【参考方案2】:
要将各个行中的数据放入数组中,请使用array constructor:
DECLARE id_nums int[]; -- assuming cust_id is of type int
id_nums := ARRAY (SELECT cust_id FROM customers WHERE name = cname);
或者聚合函数 array_agg()
id_nums := (SELECT array_agg(cust_id) FROM customers WHERE name = cname);
或使用SELECT INTO
进行分配::
SELECT INTO id_nums
ARRAY (SELECT cust_id FROM customers WHERE name = cname);
【讨论】:
以上是关于选择多行作为数组的主要内容,如果未能解决你的问题,请参考以下文章