Postgresql多插入数组变量

时间:2017-11-13 16:13:35

标签: postgresql psql

我正在寻找带有变量数组/列表的多动态插入。插入的数量总是不同的。

我想替换

insert into my table (col 1, col 2)
select *
from unnest(array[1, 2], array[3, 4]);

insert into my table (col 1, col 2)
select *
from unnest(:list-of-inserts);

2 个答案:

答案 0 :(得分:1)

取决于您是否要创建包含数据的新表?

这可能很简单:

SELECT * INTO table FROM unnest(array[1, 2], array[3, 4]);

OR

在临时表中执行相同的操作:

SELECT * INTO temp mytable FROM unnest(array[1, 2], array[3, 4]);

然后

INSERT INTO table (col 1, col 2) SELECT col1, col2 FROM mytable;

希望这会回答你的问题。

答案 1 :(得分:0)

我将它包装在一个函数中...这将很好地转换为任何具有PostgreSQL数据适配器的编程语言,这几乎就是所有这些。作为一个额外的好处,它也将在psql中运行良好。

CREATE OR REPLACE FUNCTION ez_insert(list1 integer[], list2 integer[])
  RETURNS integer AS
$BODY$
DECLARE
  rowcount integer;
BEGIN

  insert into my_table (col_1, col_2)
  values
  (unnest (list1), unnest (list2));

  GET DIAGNOSTICS rowcount = ROW_COUNT;
  return rowcount;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

调用:

select ez_insert (array[1, 2, 3], array[7, 8, 9])

警告 - 如果您的阵列大小不同,则会出现奇怪现象。

以下是C#中实现的快速示例:

NpgsqlCommand cmd = new NpgsqlCommand("select ez_insert(:ARRAY1, :ARRAY2)", conn);
cmd.Parameters.Add(new NpgsqlParameter("ARRAY1",
    NpgsqlDbType.Array | NpgsqlDbType.Integer));
cmd.Parameters.Add(new NpgsqlParameter("ARRAY2",
    NpgsqlDbType.Array | NpgsqlDbType.Integer));
cmd.Parameters[0].Value = ar1;
cmd.Parameters[1].Value = ar2;

int inserts = (int)cmd.ExecuteScalar();