2015-07-09 41 views
0

使用PSQL客户端版本20年4月8日,我创建了产生很多其他的选择命令的这个选择命令:如何使用psql客户端执行查询的结果?

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的文件。

如何在没有中间文件的单个命令中执行查询结果(那七个语句)?我试过\设置,EXECUTE,搜索网页,但不能正确。

编辑:前面的选择语句错误地在他们,我已经修复了单词“表”。

+0

你已经提到了这样做的方式。你将需要一个临时文件。 –

+0

版本8.4.20太老,现在不支持。你的肉9.4?另外*执行*很简单,问题是什么,你想如何结果*完全*? –

+0

@CraigRinger:是的,我可以使用tempfile;它似乎应该有一种方法来执行一次查询的结果。 – kslnet

回答

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(假设你是一个超级用户或拥有所有受影响的表)并随着受影响的表格被修改而逐渐降低准确度。

0

我不知道它是否适用于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; 
$$; 

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

+0

'table'关键字不能在'SELECT'语句中使用,所以这不起作用。另外,根据[documentation](http://www.postgresql.org/docs/current/static/sql-do.html),*代码块被视为没有参数的函数的主体,返回void *,因此除非使用'RAISE NOTICE'或'NOTIFY',否则不能轻易地将任何内容从代码块中传出。 – Patrick

+0

包含'table'关键字是一个错误,并且在编辑中已更正。 – kslnet