Postgres:是否有任何只返回值的row_to_json?

时间:2017-07-19 08:46:10

标签: arrays json postgresql copy

在我正在开发的项目中,我需要将Postgres数据库中的潜在大型数据集流式传输到客户端,以进行分析。

该应用程序是在Rails中构建的(与此问题无关),经过一些研究后,我现在可以使用Postgres中的COPY来传输查询结果:

COPY (SELECT row_to_json(t) from (#{query}) t) TO STDOUT;

来源(感兴趣的人):

https://shift.infinite.red/fast-csv-report-generation-with-postgres-in-rails-d444d9b915ab

https://github.com/brianhempel/stream_json_demo

这样可行,但它会将每一行都作为键值对产生,例如:

["{\"id\":403457,\"email\":\"email403457@example.com\",\"first_name\":\"Firstname403457\",\"last_name\":\"Lastname403457\",\"source\":\"adwords\",\"created_at\":\"2015-08-05T22:43:07.295796\",\"updated_at\":\"2017-01-19T04:48:29.464051\"}"]

本着最小化响应大小(以字节为单位)的精神,特别是因为这是通过Web提供的,我想只为每一行返回一个值数组,即:

["[403457, \"email403457@example.com\", \"Firstname403457\", \"Lastname403457\", \"adwords\", \"2015-08-05T22:43:07.295796\", \"2017-01-19T04:48:29.464051\"]"]

有没有办法在Postgres中实现这一点,即使是通过嵌套函数,从上面的查询开始?

1 个答案:

答案 0 :(得分:1)

您可以创建一个简单的SQL函数,将行转换为所需的格式:

CREATE FUNCTION row2json(anyelement) RETURNS json
   LANGUAGE sql STABLE AS
'SELECT json_agg(z.value) FROM json_each(row_to_json($1)) z';

然后使用它来转换输出:

SELECT row2json(mytab) FROM mytab;

如果性能比JSON输出更重要,只需将结果转换为字符串:

SELECT CAST(mytab AS text) FROM mytab;