Postgresql

PLPGSQL 將 2D 查詢輸出的列儲存到數組變數中

  • September 21, 2021

在 plpgsql 函式的某個步驟中,我需要將 2D 查詢結果儲存到數組變數中。

以下程式碼為標量完成工作(但對數組失敗):

SELECT col_a, col_b
FROM my_table
WHERE col_c = condition
INTO var_a, var_b;

以下為 ONE 列和 ONE 數組變數完成了這項工作,但僅此而已:

SELECT ARRAY(
   SELECT col_a
   FROM my_table
   WHERE col_c > condition
) INTO arr_a;

如何將 col_a、b、c、d… 中的多行儲存到它們各自的數組變數中,而不必對每一列進行單獨的查詢?與第一個程式碼範例一樣,但用於多行和數組。

用於array_agg()建構陣列。注意,它也會聚合NULL,所以請確保這是您想要的。

帶有數據和範例函式的dbfiddle 。

我假設 on 的謂詞對於和col_c都是相同的。如果它們需要單獨的謂詞,您將不得不使用或其他一些構造。我在小提琴中舉了一個例子。col_a``col_b``FILTER``FILTER

輸入表:

CREATE TABLE my_table(col_a int, col_b int, col_c int);
INSERT INTO my_table VALUES
   (1, 11, 21),
   (2, 12, 22),
   (3, 13, 23),
   (4, 14, 24),
   (5, 15, 25),
   (6, 16, 26),
   (7, 17, 27),
   (8, 18, 28),
   (9, 19, 29),
   (10, 20, 30);

功能:

CREATE OR REPLACE FUNCTION array_load() RETURNS RECORD
LANGUAGE plpgsql
IMMUTABLE PARALLEL SAFE STRICT
AS $function$
DECLARE
   arr_a integer[];
   arr_b integer[];
BEGIN
SELECT array_agg(col_a), array_agg(col_b)
FROM my_table
WHERE col_c > 26
INTO arr_a, arr_b;
RETURN (arr_a, arr_b);
END;
$function$

輸出:

select array_load();
          array_load               
--------------------------------
("{7,8,9,10}","{17,18,19,20}")
(1 row)

參考:https ://www.postgresql.org/docs/current/functions-aggregate.html

引用自:https://dba.stackexchange.com/questions/299929