【问题标题】: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[],但这产生了错误。那么选择所有结果并将它们泵入数组的正确方法是什么?还是另一种简单的使用方法?

【问题讨论】:

标签: sql arrays postgresql plpgsql


【解决方案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);

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2011-02-16
    • 2019-06-11
    • 1970-01-01
    相关资源
    最近更新 更多