我有一堆值对[(foo1, bar1), (foo2, bar2), ...]
我想做一堆更新“将‘foo’列设置为‘foo1’,其中‘bar’列为‘bar1’”。
我正在使用 psycopg2 在 Python 中执行此操作。我可以executemany
与查询UPDATE table SET foo = %s WHERE bar = %s
,但这是很多小更新,需要很长时间。
我怎样才能轻松快速地做到这一点?也许有临时表的东西?
Postgres 版本 9.3。
UPDATE tbl t
SET foo = v.foo
FROM (
VALUES ('foo1'::text, 'bar1'::text), ('foo2', 'bar2'), ...
) v(foo, bar)
WHERE t.bar = v.bar;
仅在值表达式的第一行中需要显式类型转换。text
在示例中 - 可以是任何东西。后续行中的字符串文字被强制为相同的类型。
根据键值对的形式,其他方法可能会更方便。比如:创建一个临时表,COPY
到它,然后使用临时表UPDATE
就像任何其他桌子一样。细节:
- 如何使用 Postgres 中的 CSV 文件中的值更新选定的行? https://stackoverflow.com/questions/8910494/how-to-update-selected-rows-with-values-from-a-csv-file-in-postgres/8910810#8910810
Or您可以传递两个简单数组并并行解除嵌套(Postgres 9.3 的语法):
UPDATE tbl t
SET foo = v.foo
FROM (
SELECT unnest('{foo1,foo2,...}'::text[]) AS foo
, unnest('{bar1,bar2,...}'::text[]) AS bar
) v(foo, bar)
WHERE t.bar = v.bar;
Postgres 9.4 有更好的方法:
- PostgreSQL 中是否有类似 zip() 函数的东西可以组合两个数组? https://stackoverflow.com/questions/12414750/is-there-something-like-a-zip-function-in-postgresql-that-combines-two-arrays/12414884#12414884
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)