如何将数组项插入 PostgreSQL 表

Posted

技术标签:

【中文标题】如何将数组项插入 PostgreSQL 表【英文标题】:How to insert array items into PostgreSQL table 【发布时间】:2015-03-20 10:49:38 【问题描述】:

给一个这样的数组:

my_array = [2,3,5,23,4]

还有这样的表格:

 column1 | column2 
---------+----------
   1     |     
   2     |     
   3     |     
   4     |     
   5     | 

如何将数组值插入表中。大概我想用 SQL 做这样的事情:

for item in my_array:
 UPDATE my_table SET colum2 = item

更新后的表格应该是这样的

 column1 | column2 
---------+----------
   1     |     2 
   2     |     3 
   3     |     5 
   4     |     23 
   5     |     4 

更新: 我正在使用 Python psycopg2,但我想知道是否有纯 SQL 的方法。

【问题讨论】:

您想在一列或单独的列或单独的行中添加整个数组元素 您使用哪种编程语言?你是如何用你的语言定义这个数组的?如果数组的元素比表中的行多或少怎么办?元素索引位置是否总是等于column1 中的值? (记住:关系表中的行是排序的,所以你不能通过“位置”将数组元素映射到表行) 我正在将 Python 与 psycopg2 一起使用,但我想知道是否可以使用纯 SQL 来完成。该数组将始终具有与表中的行相同数量的元素。我将使用 where 语句来确保正确的数组值映射到正确的行。 column1 中的值真的应该是数组索引吗?或者这只是一个误导性的例子?而且,与往常一样,您的 Postgres 版本是相关的。 【参考方案1】:

在 Postgres 9.4 中,为此使用 WITH ORDINALITY。比其他任何东西都更快、更清洁。

UPDATE test t
SET    column2 = a.column2
FROM   unnest('2,3,5,23,4'::int[]) WITH ORDINALITY a(column2, column1)
WHERE  t.column1 = a.column1;
PostgreSQL unnest() with element number

假设column1 代表column2 在给定数组中的位置,这只会更新应该更新的列并且不会触及其他行(就像@a_horse 答案中的简单查询一样)。

元素的序数位置也是一维数组中的默认数组下标,但 Postgres 允许任意数组索引:

Normalize array subscripts for 1-dimensional array so they start with 1

不管实际的数组下标如何,这都有效。

【讨论】:

【参考方案2】:

您需要以某种方式为表中的每一行生成一个数组“索引”。

如果 column1总是 匹配数组索引,你可以这样做。

update test  
  set column2 = (array[2,3,5,23,4])[column1];

但是如果column1中的值不能反映数组索引,则需要根据表中的排序顺序生成数组索引。如果是这种情况,您可以这样做:

with numbered_data as (
  select ctid,
         row_number() over (order by column1) as rn --<< this generates the array index values 
  from test         
)
update test  
  set column2  = (array[2,3,5,23,4])[nd.rn]
from numbered_data nd
where nd.ctid = test.ctid;

如果您的表有正确的主键,那么您可以使用它来代替 ctid 列。

【讨论】:

能否请您逐个解释set column2 = (array[foo])[bar]事物右侧的字符?【参考方案3】:

喜欢这个

insert into my_table( ..., my_column, ... )
select ..., item, ...
from   dual, ...
where item in (<your array> )

【讨论】:

dual 在 Postgres 中没有特殊含义。这甚至还没有接近答案。

以上是关于如何将数组项插入 PostgreSQL 表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pscycopg2 将字典插入 Postgresql 表

PostgreSQL,如何在不创建重复项的情况下将数组更新为现有数组?

如何使用 postgresql 中的存储过程将数据插入表中

如何将具有自定义枚举类型的数据从 csv 插入现有的 PostgreSQL 表

PostgreSQL:从另一个表插入

将 JSON 字符串数组设置为 PostgreSQL 表中的列