如何将数组项插入PostgreSQL表

ust*_*etz 11 sql arrays postgresql

给这样一个数组:

my_array = [2,3,5,23,4]
Run Code Online (Sandbox Code Playgroud)

和这样的表格:

 column1 | column2 
---------+----------
   1     |     
   2     |     
   3     |     
   4     |     
   5     | 
Run Code Online (Sandbox Code Playgroud)

如何将数组值插入表中.粗略地我想用SQL做这样的事情:

for item in my_array:
 UPDATE my_table SET colum2 = item
Run Code Online (Sandbox Code Playgroud)

更新的表应该是这样的

 column1 | column2 
---------+----------
   1     |     2 
   2     |     3 
   3     |     5 
   4     |     23 
   5     |     4 
Run Code Online (Sandbox Code Playgroud)

更新:我正在使用Python psycopg2,但我想知道是否有一种方法与纯SQL.

Erw*_*ter 6

在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;
Run Code Online (Sandbox Code Playgroud)

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

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

无论实际的数组下标如何,这都是有效的.


a_h*_*ame 5

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

如果column1始终与数组索引匹配,则可以这样做。

update test  
  set column2 = (array[2,3,5,23,4])[column1];
Run Code Online (Sandbox Code Playgroud)

但是如果in的值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;
Run Code Online (Sandbox Code Playgroud)

如果您的表有一个正确的主键,那么您可以使用它而不是ctid列。