【问题标题】:How do I execute the result of a query using the psql client?如何使用 psql 客户端执行查询结果?
【发布时间】:2015-07-09 22:24:55
【问题描述】:

使用 psql 客户端版本 8.4.20,我创建了这个选择命令,它会生成一堆其他选择命令:

mydatabase=# select concat('select count(*) from ', table_schema, '.', table_name, ';') from information_schema.tables where table_name like '%stockindex_alias%';

select count(*) from de_de.merged_stockindex_alias_de_de;
select count(*) from en_us.merged_stockindex_alias_en_us;
select count(*) from es_la.merged_stockindex_alias_es_la;
select count(*) from fr_fr.merged_stockindex_alias_fr_fr;
select count(*) from nl_nl.merged_stockindex_alias_nl_nl;
select count(*) from pt_br.merged_stockindex_alias_pt_br;
select count(*) from zh_hk.merged_stockindex_alias_zh_hk;

我知道我可以使用 \g 将这七个语句存储到一个文件中,然后使用 \i 执行该文件。

如何在没有中间文件的情况下在单个命令中执行查询结果(这七个语句)?我试过\set,EXECUTE,在网上搜索过,但都找不到。

编辑:之前的 select 语句错误地在其中包含单词“table”,我已修复。

【问题讨论】:

  • 您已经提到了这样做的方法。您将需要一个临时文件。
  • 版本 8.4.20 太旧,目前不受支持。你吃肉9.4吗? executing 也很简单,问题是你想要什么以及如何得到结果 exactly
  • @CraigRinger :是的,我可以使用临时文件;似乎应该有一种方法可以一次性执行查询结果。
  • @ErwinBrandstetter :我想要一个生成的命令,然后执行七个“选择”语句,给我这七个表的计数。
  • 将第一个 select 的输出缓存到一个文件中,然后使用 \i 命令运行生成的 SQL 脚本。

标签: postgresql psql


【解决方案1】:

我不知道它是否适用于 8.4;它适用于 9.2。

DO $$
DECLARE
    x text;
BEGIN
    FOR x IN (select concat('select count(*) from ', table_schema, '.', table_name, ';') from information_schema.tables where table_name like '%stockindex_alias%' LOOP
        EXECUTE x;
    END LOOP;
END;
$$;

基本上你创建一个匿名功能块并执行它。功能块(或任何正确名称)允许变量声明和动态执行。

【讨论】:

  • table 关键字不能在SELECT 语句中使用,因此这不起作用。此外,根据documentation代码块被视为没有参数的函数体,返回 void,因此您无法轻松地将任何内容从代码块中传递出去,除非您使用RAISE NOTICENOTIFY
  • 包含table 关键字是一个错误,已在编辑中更正。
【解决方案2】:

如果您可以通过大概的计数,您可以使用系统目录:

SELECT s.nspname AS locale, c.reltuples AS count
FROM pg_class c
JOIN pg_namespace s ON s.oid = c.relnamespace
WHERE c.relname LIKE '%stockindex_alias%';

这将在VACUUM ANALYZE 之后立即最准确(假设您是超级用户或拥有所有受影响的表)并随着受影响的表的修改而逐渐降低准确性。

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多