2017-04-06 90 views
0

我有一個複雜的數據庫,其中的鍵和值存儲在不同的表中。這是USEF爲我的應用程序拉出值時,它們聚集,像這樣:postgres中的Array_agg有選擇地引用

SELECT array_agg(key_name), array_agg(vals) 
        FROM (
         SELECT 
          id, 
          key_name, 
          array_agg(value)::VARCHAR(255) AS vals 
         FROM factor_key_values 
         WHERE id=20 
         GROUP BY key_name, id 
        ) f; 

這個特定的查詢,在我的情況下提供了以下無效JSON:

-[ RECORD 1 ]----------------------------------------------------------------------- 
array_agg | {"comparison method","field score","field value"} 
array_agg | {"{\"text category\"}","{100,70,50,0,30}","{A,B,C,F,\"No Experience\"}"} 

注意,數組varchars僅在字符串有空格時被引用。我已經縮小下來到ARRAY_AGG爲了完整這裏的行爲是一個例子:

BEGIN; 
CREATE TABLE test (txt VARCHAR(255)); 
INSERT INTO test(txt) VALUES ('one'),('two'),('three'), ('four five'); 
SELECT array_agg(txt) FROM test; 

結果將是:

{one,two,three,"four five"} 

這就是爲什麼我的JSON是打破。我可以在應用程序代碼中處理未加引號或帶引號的字符串,但混合使用堅果。有沒有解決這個問題的方法?

回答

2

難道你不能使用json_agg

select json_agg(txt) from test; 
       json_agg    
-------------------------------------- 
["one", "two", "three", "four five"] 
+0

我試過,但事情是它是一個相當大的查詢,這是一個子查詢中,所以如果我json編碼的內部選擇我結束了雙json編碼。 –

+0

@FrankConry因此,回到基礎知識並顯示樣本數據和預期輸出。 –

+0

我最終不得不重構整個查詢,但最後'json_agg'是正確的選擇。謝謝! –

0

不幸的是,這是postgres用於格式化數組的不一致的標準。 Array Syntax

Clodo阿爾的答案可能是你想要的,但作爲替代,你也可以建立自己的結果:

SELECT '{'||array_to_string(array_agg(txt::text), ',')||'}' FROM test;