Array_agg in postgres selectively quotes

℡╲_俬逩灬. 提交于 2019-12-20 04:23:47

问题


I have a complex database with keys and values stored in different tables. It is useful for me to aggregate them when pulling out the values for the application:

   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;

This particular query, in my case gives the following invalid 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\"}"}

Notice that the array of varchars is only quoted if the string has a space. I have narrowed this down to the behaviour of ARRAY_AGG. For completeness here is an example:

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

The result will be:

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

This is why my JSON is breaking. I can handle unquoted or quoted strings in the application code, but have a mix in nuts.

Is there any solution to this?


回答1:


Can't you use json_agg?

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



回答2:


Unfortunately, this is the inconsistent standard that PostgreSQL uses for formatting arrays. See "Array Input and Output Syntax" for more information.

Clodoaldo's answer is probably what you want, but as an alternative, you could also build your own result:

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


来源:https://stackoverflow.com/questions/43262126/array-agg-in-postgres-selectively-quotes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!