2015-11-03 55 views
0

我需要創建一個宏或函數,它接受兩個參數,並在基本數據處理後將它們連接在一起。那麼這個文本字符串應該能夠用於任何其他查詢。Postgres宏,Concat間隔日期和表名在查詢中使用

CREATE OR REPLACE FUNCTION getData (_table text, _days text) 
    RETURNS text AS 
$func$ 

    SELECT $1 || to_char(CURRENT_TIMESTAMP - ($2 || ' days')::INTERVAL, 'YYYYMMDD'); 
$func$ LANGUAGE sql; 

select * from getData('opportunity', '4') limit 10; 

那麼我從這個期待是真正得到同樣的結果,如果我執行

select * from opportunity20151030 limit 10; 

相反,我得到「opportunity20151030」

編輯:

的我們需要這樣做的原因是因爲我的僱主每晚都在做我們的銷售隊伍數據的快照,總共有大約17個對象。這就是爲什麼我不能返回一張桌子。返回表格需要指定列。但是我們需要能夠查詢各種表格。這確實需要只是一個小實用宏。這樣我們可以有一個查詢來生成比較今天和一週前的數據的圖表。這甚至可以是pgAdmin本身的內容,並且不限於作爲postgresql函數。有沒有一種方法可以執行該函數並在另一個查詢中內聯使用結果。我花了一個小時,

玩耍用的getData執行「SELECT * FROM $ 1」(「機會」,「4」)

類型的查詢,但顯然語言指定的變化,不能用什麼在兼容的SQL語句方面。

謝謝!

+0

這看起來像一個可怕的數據模型。你應該首先需要這樣的功能。你爲什麼不使用分區/繼承呢? –

+0

謝謝你的建議。我的僱主只想編寫一組查詢,以便從我們從salesforce獲取的夜間快照生成報告。這並不一定是在postgres中,而可以在像pgAdmin這樣的工具中。 –

回答

0

那麼,你的功能究竟是什麼返回你問的...你想在看錶的名稱。

現在,當你能做到這一點返回某個表的數據,該功能必須的功能知道這些數據的「結構」。這意味着您不能將它用於任何表格,而是那些共享相同結構(相同數量的字段,相同順序中的數據類型相同)的表格。猜測你的表的名字,我會說,是一種遺傳表像一個belowe功能可以做的伎倆對於任何派生(繼承)表從機會

CREATE OR REPLACE FUNCTION getData (_table text, _days text, _limit int default -1) 
    RETURNS SETOF opportunity AS 
$func$ 
DECLARE 
    table_name text; 
    limit_clause text = ' '; 
BEGIN 
    SELECT _table || to_char(CURRENT_TIMESTAMP - (_days || ' days')::INTERVAL, 'YYYYMMDD') INTO table_name; 
    IF _limit > -1 THEN 
     limit_clause = ' LIMIT ' || _limit; 
    END IF; 
    RETURN QUERY EXECUTE 'SELECT * FROM ' || table_name || limit_clause; 
    RETURN; 
END 
$func$ LANGUAGE plpgsql; 

而且使用它像:

select * from getData('opportunity', '4', 10); 

PS1:我把限制作爲一個額外的參數在函數中,但因爲該參數有一個默認值,你可以在調用該函數時忽略它,並返回所有值。我把它放在那裏,否則函數將返回表中的所有行,並在此之後限制。

PS2:我會避免這樣做,除非你真的認爲是必要的,因爲如果作爲更大的查詢的一部分放置,這不能被優化。

+0

非常感謝您的貢獻。但是,我們每晚拍攝17張表格。我們需要的是非常簡單,更像一個優秀的公式。也許它是我們可以在pgAdmin中做的事情?或者,也許我可以執行該函數並在另一個查詢中內聯使用結果? –

+0

這17桌有不同的結構嗎?每晚的快照是那些看起來像「opportunity20151030」? (即:將日期作爲名稱的一部分) –

+0

是的,我們通過使用元數據創建postgres表格,然後填充它們來拍攝不同SObjects的快照。因此,不僅17個表的結構不同,同一個SObject可能會從一天變爲另一天,如果在Salesforce中進行了修改,這會在postgres中反映出來。謝謝! –