给出一个这样的数组:
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的方式。
答案 0 :(得分: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;
假设column1
表示给定数组中column2
的位置,这只会更新应该更新的列,而不会触及其他行(例如@ a_horse&#39中的简单查询;答案会)。
元素的序数位置也是一维数组中的默认数组下标,但Postgres允许任意数组索引:
无论实际数组下标如何,这都有效。
答案 1 :(得分:4)
您需要以某种方式为表中的每一行生成一个数组“索引”。
如果 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
列。
答案 2 :(得分:-5)
insert into my_table( ..., my_column, ... )
select ..., item, ...
from dual, ...
where item in (<your array> )