选择多行作为数组

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);

【讨论】:

以上是关于选择多行作为数组的主要内容,如果未能解决你的问题,请参考以下文章

mysql选择匹配id数组的多行

MySQL从一个表中选择行,第二个表中有多行,并在所选行中获取多行数组

选择数组、子查询和多行结果

Hive_列转行(集合/数组转多行)

使用选择插入多行

如何从具有多行的 SQL 查询中获取非字符串数组字段