如何使用psql客户端执行查询结果?

时间:2015-07-09 22:24:55

标签: postgresql psql

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

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执行该文件。

如何在没有中间文件的单个命令中执行查询结果(那七个语句)?我已经尝试过设置,执行,搜索网络,但无法正确使用。

编辑:之前的选择语句错误地使用了" table"在其中,我已经修复了。

2 个答案:

答案 0 :(得分: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;
$$;

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

答案 1 :(得分:0)

如果您可以使用近似计数,则可以使用系统目录:

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之后(假设您是超级用户或拥有所有受影响的表),这将是最准确的,并且随着受影响的表的修改而逐渐降低准确性。