在 PostgreSQL 中使用关联数组进行批量更新
Bulk update with associative array in PostgreSQL
假设我有一个关联数组(用另一种语言定义),如下所示:
apply = {
'qwer': ['tju', 'snf', 'rjtj', 'sadgg']
'asdf': ['rtj', 'sfm', 'rtjt', 'adjdj']
...
'zxcv': ['qwr', 'trj', '3w4u', '3tt3']
}
我有一个 table 像这样:
CREATE TABLE apples (
id integer,
name varchar(10),
key varchar(10),
value varchar(10)
);
我想应用更新,如果 apples.value
在 apply
变量的列表之一中,则将 apples.key
设置为数组的键。如果 apples.value
为 tju
,则将 apples.key
设置为 qwer
。
我目前的方法是这样的(将 PostgreSQL 与任何过程语言混合):
for key in apply.keys:
UPDATE apples SET key=$key
FROM (SELECT unnest(array($apply[key])) AS value) AS update_table
WHERE value=update_table.value
我想在一条语句中做到这一点。
作为给定示例的概念证明,字符串格式与您显示的完全相同:
演示准备好的语句,就像您的客户可能使用的那样。
PREPARE my_update AS
UPDATE apples a
SET key = upd.key
FROM (
SELECT trim (split_part(key_val, ': ', 1), ' ''') AS key
, string_to_array(translate(split_part(key_val, ': ', 2), '[]''', ''), ', ') AS val_arr
FROM unnest(string_to_array(trim(, E'{}\n'), E'\n')) key_val
) upd
WHERE a.value = ANY(upd.val_arr);
EXECUTE
在同一会话中任意次数:
EXECUTE my_update($assoc_arr${
'qwer': ['tju', 'snf', 'rjtj', 'sadgg']
'asdf': ['rtj', 'sfm', 'rtjt', 'adjdj']
'zxcv': ['qwr', 'trj', '3w4u', '3tt3']
}$assoc_arr$);
相关:
- Insert text with single quotes in PostgreSQL
但我宁愿以其原始语言处理类型并分别传递 key
和 val_arr
。
假设我有一个关联数组(用另一种语言定义),如下所示:
apply = {
'qwer': ['tju', 'snf', 'rjtj', 'sadgg']
'asdf': ['rtj', 'sfm', 'rtjt', 'adjdj']
...
'zxcv': ['qwr', 'trj', '3w4u', '3tt3']
}
我有一个 table 像这样:
CREATE TABLE apples (
id integer,
name varchar(10),
key varchar(10),
value varchar(10)
);
我想应用更新,如果 apples.value
在 apply
变量的列表之一中,则将 apples.key
设置为数组的键。如果 apples.value
为 tju
,则将 apples.key
设置为 qwer
。
我目前的方法是这样的(将 PostgreSQL 与任何过程语言混合):
for key in apply.keys:
UPDATE apples SET key=$key
FROM (SELECT unnest(array($apply[key])) AS value) AS update_table
WHERE value=update_table.value
我想在一条语句中做到这一点。
作为给定示例的概念证明,字符串格式与您显示的完全相同:
演示准备好的语句,就像您的客户可能使用的那样。
PREPARE my_update AS
UPDATE apples a
SET key = upd.key
FROM (
SELECT trim (split_part(key_val, ': ', 1), ' ''') AS key
, string_to_array(translate(split_part(key_val, ': ', 2), '[]''', ''), ', ') AS val_arr
FROM unnest(string_to_array(trim(, E'{}\n'), E'\n')) key_val
) upd
WHERE a.value = ANY(upd.val_arr);
EXECUTE
在同一会话中任意次数:
EXECUTE my_update($assoc_arr${
'qwer': ['tju', 'snf', 'rjtj', 'sadgg']
'asdf': ['rtj', 'sfm', 'rtjt', 'adjdj']
'zxcv': ['qwr', 'trj', '3w4u', '3tt3']
}$assoc_arr$);
相关:
- Insert text with single quotes in PostgreSQL
但我宁愿以其原始语言处理类型并分别传递 key
和 val_arr
。