sql - Postgres - 将行数据作为 JSON 数组或数组返回

标签 sql arrays json postgresql postgresql-9.4

在 PG v9.4 及更高版本上,我想将一些数据(基于 SELECT 语句)导出为 JSON array of arrays

标准 json_agg 返回我想要的但它返回对象数组(其中对象键是列名) 例如这个查询:

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

返回以下内容:

[
 {"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

返回以下(列顺序错误)

[
 ["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");

关于sql - Postgres - 将行数据作为 JSON 数组或数组返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39456362/

相关文章:

SQL SELECT 获取前N个正整数

php - 使用 CDbCriteria 根据值数组查询数据库

PHP Mysqli 从 JOIN 返回数组(别名为数组键)

java - 随机化数字 1 到 100 的数组

java - 从java代码启动RESTful服务器

sql - 如何比较两个表并返回与 HIVE 不同的行

mysql - (SQL) 如何根据另一个表的 ID 将值添加到一个表中?

php - 根据另一个 JSON 编码数组对另一个数组进行排序

javascript - 一个请求中包含 JSON 和 HTML?

objective-c - 获取正确的 Node Json objective c