如何在PostgreSQL中使用变量表更新?

如何在PostgreSQL中使用变量表更新?,sql,postgresql,sql-update,dynamic-sql,plpgsql,Sql,Postgresql,Sql Update,Dynamic Sql,Plpgsql,例如: Table=["category1","category2","category3"] for varTable in Table: cr.execute('update varTable SET id=%s,WHERE id=%s) ........ .... 如何执行此循环?为此使用动态SQL。默认情况下,将plpgsql与一起使用。 创建函数或使用DO语句进行临时执行 动态结构化查询语言 电话: 有很多类似的答案。有关更多示例和说明,请搜索并执行

例如:

Table=["category1","category2","category3"]

for varTable in Table:
    cr.execute('update varTable SET id=%s,WHERE id=%s)
     ........
       ....

如何执行此循环?

为此使用动态SQL。默认情况下,将plpgsql与一起使用。
创建函数或使用
DO
语句进行临时执行

动态结构化查询语言 电话:

有很多类似的答案。有关更多示例和说明,请搜索并执行
EXECUTE

纯SQL 如果plpgsql对您来说仍然是一个黑魔法,那么您可以通过修改数据的CTE非常有效地解决这个简单的问题。需要PostgreSQL 9.1-for


为此,请使用动态SQL。默认情况下,将plpgsql与一起使用。
创建函数或使用
DO
语句进行临时执行

动态结构化查询语言 电话:

有很多类似的答案。有关更多示例和说明,请搜索并执行
EXECUTE

纯SQL 如果plpgsql对您来说仍然是一个黑魔法,那么您可以通过修改数据的CTE非常有效地解决这个简单的问题。需要PostgreSQL 9.1-for


@John.zero:我添加了一个简单的SQL替代方案。:)如果我有很多表要更改,纯SQL将太长。我只需在Postgre SQL中尝试动态SQL。出现错误“错误:运算符不唯一:未知| |文本[]第2行:更新“| | | | | |”^”@John.zero:我的错误,修复了查询。我需要在:创建或替换函数f|up中添加一个变量(varTable,_new_id int,_old_id int),如何更改代码?@John.zero:我添加了一个纯SQL替代方案。:)如果我有很多表要更改,纯SQL将太长。我只需在Postgre SQL中尝试动态SQL。出现错误“错误:运算符不唯一:未知| text[]第2行:更新“|| | | tbl |”^”@John.zero:我的错误,修复了查询。我需要在中添加一个变量:创建或替换函数f_up(varTable,_new_id int,_old_id int),如何更改代码?
CREATE OR REPLACE FUNCTION f_up(_new_id int, _old_id int)
  RETURNS void AS
$BODY$
DECLARE
    _tbl text[] := '{category1,category2,category3}';
    t    text;

BEGIN

FOREACH t IN ARRAY _tbl
LOOP
    EXECUTE '
    UPDATE ' || t || '
    SET    id = $1
    WHERE  id = $2'
    USING  _new_id, _old_id;
END LOOP;

END;
$BODY$ LANGUAGE plpgsql;
SELECT f_up(23, 45);
WITH vals AS (
    SELECT 23 AS new_id, 45 AS old_id -- provide values once
    )
    , a AS (
    UPDATE category1
    SET    id = v.new_id
    FROM   vals v
    WHERE  id = v.old_id
    )
    , b AS (
    UPDATE category2
    SET    id = v.new_id
    FROM   vals v
    WHERE  id = v.old_id
    )
UPDATE category3
SET    id = v.new_id
FROM   vals v
WHERE  id = v.old_id;