0

我需要创建一个 plpgsql 函数,将数组中每个项目的一行插入表中。

例如: the_array=[1,2,3]

the_array插入后的结果temp_table

col
----
1
2
3

我从这个链接中找到了以下代码:http: //postgresql.1045698.n5.nabble.com/insert-into-table-from-list-or-array-td3217891.html

INSERT INTO tmptab 
   SELECT v 
     FROM unnest(string_to_array('1,2,4,2,1',',')) g(v) 

它就像一个魅力,但我不明白这段代码是如何工作的。谁能帮我解释一下,好吗?

4

2 回答 2

2

函数string_to_array('1,2,4,2,1', ',')从字符串创建一个数组,因此您可以使用它ARRAY[1,2,4,2,1]

函数unnest(array)将数组扩展为一组行。所以你有一组五行,每行都有整数。

需要最后一部分g(v),因为您需要命名行集及其列。

所以整体unnest(string_to_array('1,2,4,2,1',','))返回一组行,每行有一列。它被映射到g(v),因此您可以v用作值。

如果您有一个类似的表create table g(v integer);并在其中插入了带有值的行:1,2,4,2,1,那么您将获得相同的结果:

INSERT INTO tmptab 
   SELECT v 
     FROM g; 
于 2013-07-29T07:22:02.117 回答
1

PostgreSQL 支持 Set Returning Function(第二个名称是表格函数)。此类中的函数返回一个表而不是标量值。有很多用例 - 一个用例是“unnest”函数

创建或替换函数 simple_srf(int)
返回 SETOF int AS $$
开始
  对于我 1..$ 1
  环形
    返回下一个 i; -- 将值推送到结果
  结束循环;
  返回; -- 完成执行
结尾;
$$ 语言 plpgsql 不可变严格;

postgres=# SELECT * FROM simple_srf(3);
 simple_srf
------------
          1
          2
          3
(3 行)

函数“string_to_array”使用分隔符将字符串解析为数组。

postgres=# select string_to_array('aaa*bbb*ccc','*');
 string_to_array
-----------------
 {aaa,bbb,ccc}
(1 行)

Unnest 是一个简单的函数,它将数组转换为表。plpgsql中这个函数的源代码可以是:

-- 为简单起见,使用 PostgreSQL 8.4 语法
创建或替换函数 unnest(anyarray)
返回 SETOF 任何元素为 $$
开始
  FOR i IN array_lower($1,1) .. array_upper($1,1)
  环形
    返回下一个 $1[i];
  结束循环;
  返回;
结尾;
$$ 语言 plpgsql 严格不可变;

“Unnest”是一个多态集返回函数。PostgreSQL 支持更多的内置 srf (tabular) 函数 - 例如 generic_series 或 generate_subscripts

“unnest”函数的旧实现是:

创建或替换函数 unnest(anyarray)
将任何元素返回为 $$
SELECT $1[i] FROM generate_series(array_lower($1,1),array_upper($1,1)) g(i)
$$ 语言 sql;

-- 或使用 generate_subscripts
创建或替换函数 unnest(anyarray)
将任何元素返回为 $$
/*
 * g 是表别名
 * i 是列别名
 */
从 generate_subscripts($1,1) g(i) 中选择 $1[i]
$$ 语言 sql;
于 2013-07-29T07:32:34.183 回答