2015-02-05 58 views
0

我有一個plpgsql函數和一個複雜的嵌套SELECT查詢,我想返回查詢的結果表作爲JSON。我會如何去做這件事?我有這樣的事情:從函數返回SELECT結果作爲JSON(Postgres)

CREATE TEMPORARY TABLE selectRESULTS AS 
/*some long, complicated, and nested SELECT query 
............. 
.............. 
*/ 
RETURN array_to_json(array_agg(selectResults)); 

編輯:我試圖解決方案

使用Pozs'的方法之一後增加了額外的規格:

RETURN (SELECT json_agg(selectResults) FROM selectResults); 

我得到一個JSON。但是它與額外的數組嵌套,這使得內部對象難以訪問。

目前我得到

[['[{"someKey": someValue}, etc]']] 

有什麼辦法來擺脫兩個外部陣列,這樣,而不是使用

somejson[0][0][0]["someKey"]接取someValue,我可以只使用someJson[0]["someKey"]

在此先感謝!

回答

1

總之,你的語法錯誤;您需要SELECT才能使用聚合函數,如array_agg。您可以使用array()構造太:

-- do NOT use these, these are far from optimal 

RETURN array_to_json(array(SELECT selectResults FROM selectResults)); 
-- or 
RETURN (SELECT array_to_json(array_agg(selectResults)) FROM selectResults); 

json_agg(...)有效地做同樣的array_to_json(array_agg(...))但速度更快:

RETURN (SELECT json_agg(selectResults) FROM selectResults); 

注:我以前selectResults選擇selectResults表的整行,但如果你只有1列,你可以直接使用它。

但是,根本不需要臨時表。如果你的邏輯很簡單,你可以使用簡單的sql功能,如:

create function xyz(p1_type, ..., pn_type) 
    returns json 
    language sql 
as $func$ 
    select json_agg(select_results) 
    from (
    /*some SELECT query here 
    ............. 
    use $1 ... $<n> for parameters here, 
    or you can name them also within sql functions 
    ............. 
    */ 
) select_results 
$func$; 
+0

謝謝!我還沒有嘗試過,但我的查詢是相當複雜的(嵌套嚴重,執行各種計算,並與多列工作),所以一個簡單的SQL函數可能是不可能的。 – Teboto

+0

編輯我的帖子。你碰巧有一個可以滿足我額外規格的替代解決方案嗎? – Teboto

+0

@Teboto沒有任何關於'selectResults'的更多知識是不可能分辨出來的。 (最可能的解決方案是您的數據已經在數組中)請提供更多詳細信息,並且不要在每一個新信息之後改變問題。如果您有新問題,請將其作爲單獨問題發佈。 – pozs