选择多行作为数组

9

我有一张表格,可能会出现两个人的名字相同,但是他们有不同的ID。我已经知道了这些人的名字,需要请求他们的ID。

当我使用像下面这样的命令时:

SELECT id_num INTO cust_id FROM Customers WHERE name=CName; 

如果我在命令行(psql)中使用此命令,则会返回两个结果(例如)。

但是当我将其作为SQL脚本(PL/pgSQL)的一部分使用时,它总是只获取第一个实例。

我尝试选择到cust_id[],但是出现了错误。那么选择所有结果并将它们放入数组或其他易于使用的方式的正确方法是什么?


这是一个关于在PL/pgSQL中使用数组的示例:https://dev59.com/r2gt5IYBdhLWcg3w5xc_ - sufleR
数组的替代方案可能是循环?有没有一种指定获取“下一个”结果的方法? - user974703
2个回答

14

在声明中

  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控制结构 9.1.


你能否对循环版本再多解释一些呢?id_num是我的自定义变量,cust_id是Customers表中的一列。我收到一个错误提示:“数组值必须以“{”或维度信息开头。上下文指向FOR选择语句。” - user974703
太好了,那就是我声明id_nums为数组的问题。非常感谢您详尽易读的回复! - user974703
FOR循环看起来不错,但是SELECT INTO的示例与问题中的示例一样失败了。 - Erwin Brandstetter
@ErwinBrandstetter 您是对的,我之前没有测试过。已经更正了答案。 - sufleR

7

要将单个行的数据放入数组中,使用数组构造器

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接