选择多行作为数组

use*_*703 6 sql arrays postgresql plpgsql

我有一张桌子,其中两个人可能有相同的名字,但有不同的ID.我得到了名字,需要申请他们的身份证.

当我使用如下命令时:

SELECT id_num INTO cust_id FROM Customers WHERE name=CName; 
Run Code Online (Sandbox Code Playgroud)

如果我在命令行(psql)上使用此命令,则返回2个结果(例如).

但是当我将它用作SQL脚本(PL/pgSQL)的一部分时,它总是抓住第一个实例.

我试过选择cust_id[],但这产生了一个错误.那么选择所有结果的正确方法是什么,并将它们泵入阵列或其他简单方法来使用它们?

suf*_*leR 9

在声明

  DECLARE id_nums bigint[];
Run Code Online (Sandbox Code Playgroud)

在选择

id_nums :=  ARRAY(select cust_id from Customers WHERE name = CName);
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢循环使用

DECLARE id_num bigint;

FOR id_num in select cust_id from Customers WHERE name = CName LOOP
  your code here
END LOOP;
Run Code Online (Sandbox Code Playgroud)

在postgresql docs 9.1中读取plpgsql控件结构.


Erw*_*ter 7

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

DECLARE id_nums int[];  -- assuming cust_id is of type int

id_nums := ARRAY (SELECT cust_id FROM customers WHERE name = cname);
Run Code Online (Sandbox Code Playgroud)

或者聚合函数 array_agg()

id_nums := (SELECT array_agg(cust_id) FROM customers WHERE name = cname);
Run Code Online (Sandbox Code Playgroud)

SELECT INTO用于分配::

SELECT INTO id_nums
       ARRAY (SELECT cust_id FROM customers WHERE name = cname);
Run Code Online (Sandbox Code Playgroud)