【问题标题】:How to execute a query which is stored in a table column PostgreSql?如何执行存储在表列 PostgreSql 中的查询?
【发布时间】:2015-08-06 05:56:36
【问题描述】:

我有一个包含以下文本数据的表格列:

"drop table log_history_2_2015"
"drop table log_history_3_2015"
"drop table log_history_4_2015"
"drop table log_history_5_2015"
"drop table log_history_6_2015"

如何在不遍历所有这些行并单独执行它们的情况下一次性执行它们。

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    更通用的解决方案是使用DO 块来执行动态SQL:

    DO
    LANGUAGE plpgsql
    $$
    DECLARE
      stmt text;
    BEGIN
      FOR stmt IN
        SELECT statement FROM the_table
      LOOP
        EXECUTE stmt;
      END LOOP;
    END;
    $$;
    

    请注意,这在单个事务中运行。

    【讨论】:

    • Code-Monk 没有循环询问,所以Do 块与execute 的一行相同
    • @VaoTsun 我认为这是为了避免 client-side 循环。在 PL/PgSQL 的循环中执行它们与在多语句中执行它们之间没有有意义的区别。如果您发送多语句,PostgreSQL 后端只会循环语句,就像您在 PL/PgSQL 中所做的那样。
    • 我们可以在 Redshift 中使用它吗?直到现在我才能运行它
    • @GarouDan 几乎可以肯定不是。 Redshift 基于超古老的 PostgreSQL - 8.2 IIRC。
    【解决方案2】:

    使用SELECT string_agg(COLUMN_NAME,';')||chr(10) - 它会给你一行来运行

    【讨论】:

    • 感谢回答。||chr(10) 在查询中有什么用?
    • ||chr(10) 将单行刹车到 miltiples - 在分号后添加十个 ASCCI 字符
    • 好的,感谢您的帮助
    • @Code-Monk 不用担心。我的荣幸
    • chr(10) 是 ASCII 换行符。您也可以在 PostgreSQL 中将其写为E'\r'。此代码在整个语句系列的末尾附加 single 换行符。如果你想在每个分号后面加一个,你需要在函数调用中移动||chr(10)。我会将分隔符写成E';\r' 或简单地包含一个文字换行符。
    猜你喜欢
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2020-01-11
    • 2021-06-14
    • 2018-06-26
    • 1970-01-01
    相关资源
    最近更新 更多