2015-07-09 43 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