postgres中的Array_agg有选择地引用

时间:2017-04-06 17:36:20

标签: arrays json postgresql aggregate-functions

我有一个复杂的数据库,其中的键和值存储在不同的表中。在拉出应用程序的值时,我可以使用它来聚合它们:

   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 个答案:

答案 0 :(得分:3)

你不能使用json_agg吗?

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

答案 1 :(得分:0)

不幸的是,这是postgres用于格式化数组的不一致标准。 Array Syntax

Clodoaldo的回答可能就是你想要的,但作为替代方案,你也可以建立自己的结果:

valueOf