簡體   English   中英

Postgres - 將行數據作為JSON數組或數組返回

[英]Postgres - return row data as JSON array or arrays

在PG v9.4及更高版本上,我想將一些數據(基於SELECT語句)導出為JSON數組數組

標准的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"}
]

我試圖使用這里提到的技巧首先將行轉換為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將所有這些數組收集到一個數組中。

您還可以在aggragate函數內移動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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM