Postgres - return 行数据作为 JSON 数组或数组
Postgres - return row data as JSON array or arrays
在 PG v9.4 及更高版本上,我想将一些数据(基于 SELECT 语句)导出为 JSON 数组数组 。
标准 json_agg returns 我想要的但它 returns 对象数组(其中对象键是列名)
例如这个查询:
SELECT json_agg(data_rows)
FROM (
-- in memory table sample
SELECT * FROM
(VALUES
('John',now(),1940,'Winston','Lennon'),
('Paul',now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo',now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName")
ORDER BY "BirthYear" DESC, "FirstName" DESC
) AS data_rows
returns 以下:
[
{"FirstName":"George","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1943,"MiddleName":null,"LastName":"Harrison"},
{"FirstName":"Paul","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1942,"MiddleName":"","LastName":"McCartney"},
{"FirstName":"Ringo","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1940,"MiddleName":"my passions are ring,drum and shades","LastName":"Starr"},
{"FirstName":"John","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1940,"MiddleName":"Winston","LastName":"Lennon"}
]
但我想要的是:
[
["George","2016-09-12T13:13:07.862485-04:00",1943,null,"Harrison"},
["Paul","2016-09-12T13:13:07.862485-04:00",1942,"","McCartney"},
["Ringo","2016-09-12T13:13:07.862485-04:00",1940,"my passions are ring,drum and shades","Starr"},
["John","2016-09-12T13:13:07.862485-04:00",1940,"Winston","Lennon"}
]
我曾尝试使用技巧 mentioned here 先将行转换为 hstore,但问题是列顺序未保留....
所以这个查询:
SELECT json_agg(avals(hstore(data_rows)))
FROM (
-- in memory table sample
SELECT * FROM
(VALUES
('John', now(),1940,'Winston','Lennon'),
('Paul', now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo', now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName")
ORDER BY "BirthYear" DESC, "FirstName" DESC
) AS data_rows
-- placing order by 'outside' did not make any difference
--ORDER BY "BirthYear" DESC, "FirstName" DESC
returns 以下(列顺序错误)
[
["Harrison","1943","2016-09-12 14:07:06.772227-04","George",null],
["McCartney","1942","2016-09-12 14:07:06.772227-04","Paul",""],
["Starr","1940","2016-09-12 14:07:06.772227-04","Ringo","my passions are ring,drum and shades"],
["Lennon","1940","2016-09-12 14:07:06.772227-04","John","Winston"]
]
有谁知道如何将结果作为 JSON 数组的数组?
您可能想要这样的东西:
SELECT json_agg(info)
FROM (
SELECT json_build_array("LastName","BirthYear","CurrentDt","FirstName","MiddleName") AS info
FROM
(VALUES
('John',now(),1940,'Winston','Lennon'),
('Paul',now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo',now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName")
ORDER BY "BirthYear" DESC, "FirstName" DESC
) as t;
我使用 json_build_array
将每个人的所有值放在一个 json 数组中,然后在外部查询中,我使用 json_agg
将所有这些数组收集到一个数组中数组的数组。
您还可以在聚合函数中移动 ORDER BY
子句以获得以下内容:
SELECT json_agg(json_build_array("LastName","BirthYear","CurrentDt","FirstName","MiddleName") ORDER BY "BirthYear" DESC, "FirstName" DESC)
FROM
(VALUES
('John',now(),1940,'Winston','Lennon'),
('Paul',now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo',now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName");
在 PG v9.4 及更高版本上,我想将一些数据(基于 SELECT 语句)导出为 JSON 数组数组 。
标准 json_agg returns 我想要的但它 returns 对象数组(其中对象键是列名) 例如这个查询:
SELECT json_agg(data_rows)
FROM (
-- in memory table sample
SELECT * FROM
(VALUES
('John',now(),1940,'Winston','Lennon'),
('Paul',now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo',now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName")
ORDER BY "BirthYear" DESC, "FirstName" DESC
) AS data_rows
returns 以下:
[
{"FirstName":"George","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1943,"MiddleName":null,"LastName":"Harrison"},
{"FirstName":"Paul","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1942,"MiddleName":"","LastName":"McCartney"},
{"FirstName":"Ringo","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1940,"MiddleName":"my passions are ring,drum and shades","LastName":"Starr"},
{"FirstName":"John","CurrentDt":"2016-09-12T13:13:07.862485-04:00","BirthYear":1940,"MiddleName":"Winston","LastName":"Lennon"}
]
但我想要的是:
[
["George","2016-09-12T13:13:07.862485-04:00",1943,null,"Harrison"},
["Paul","2016-09-12T13:13:07.862485-04:00",1942,"","McCartney"},
["Ringo","2016-09-12T13:13:07.862485-04:00",1940,"my passions are ring,drum and shades","Starr"},
["John","2016-09-12T13:13:07.862485-04:00",1940,"Winston","Lennon"}
]
我曾尝试使用技巧 mentioned here 先将行转换为 hstore,但问题是列顺序未保留.... 所以这个查询:
SELECT json_agg(avals(hstore(data_rows)))
FROM (
-- in memory table sample
SELECT * FROM
(VALUES
('John', now(),1940,'Winston','Lennon'),
('Paul', now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo', now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName")
ORDER BY "BirthYear" DESC, "FirstName" DESC
) AS data_rows
-- placing order by 'outside' did not make any difference
--ORDER BY "BirthYear" DESC, "FirstName" DESC
returns 以下(列顺序错误)
[
["Harrison","1943","2016-09-12 14:07:06.772227-04","George",null],
["McCartney","1942","2016-09-12 14:07:06.772227-04","Paul",""],
["Starr","1940","2016-09-12 14:07:06.772227-04","Ringo","my passions are ring,drum and shades"],
["Lennon","1940","2016-09-12 14:07:06.772227-04","John","Winston"]
]
有谁知道如何将结果作为 JSON 数组的数组?
您可能想要这样的东西:
SELECT json_agg(info)
FROM (
SELECT json_build_array("LastName","BirthYear","CurrentDt","FirstName","MiddleName") AS info
FROM
(VALUES
('John',now(),1940,'Winston','Lennon'),
('Paul',now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo',now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName")
ORDER BY "BirthYear" DESC, "FirstName" DESC
) as t;
我使用 json_build_array
将每个人的所有值放在一个 json 数组中,然后在外部查询中,我使用 json_agg
将所有这些数组收集到一个数组中数组的数组。
您还可以在聚合函数中移动 ORDER BY
子句以获得以下内容:
SELECT json_agg(json_build_array("LastName","BirthYear","CurrentDt","FirstName","MiddleName") ORDER BY "BirthYear" DESC, "FirstName" DESC)
FROM
(VALUES
('John',now(),1940,'Winston','Lennon'),
('Paul',now(),1942,'','McCartney'),
('George',now(),1943,NULL,'Harrison'),
('Ringo',now(),1940,'my passions are ring,drum and shades','Starr')
) AS x("FirstName", "CurrentDt", "BirthYear", "MiddleName", "LastName");