簡體   English   中英

如何在 postgres 中訂購 json 列

[英]How to order a json column in postgres

所以我有一個具有以下結構的 jsonb 列:

{
    "fields": [{
         "name": "John",
         "position": 1
    },{
         "name": "Mike",
         "position": 2
   }]
}

jsonb 列在我的“人”表中。 我想 select 人表,包括 jsonb 列,但我也希望 jsonb 列按“位置”降序排列,這可能嗎?

到目前為止,我有這個查詢。

SELECT
    person_id
    name
    jsonb_agg(field ORDER BY field->'fields'->0->>'position' DESC)
FROM
    person
WHERE (
    person_id = 42
) GROUP BY name

假設表person具有以下結構和數據:

CREATE TABLE person (person_id, name, field) AS
VALUES
    (
        42,
        'foo',
        '{
            "fields": [
                { "name": "John", "position": 1 },
                { "name": "Mike", "position": 2 }
            ]
        }'::jsonb
    ),
    (
        13,
        'bar',
        '{
            "fields": [
                { "name": "Anne", "position": 33 },
                { "name": "Melinda", "position": 66 }
            ]
        }'::jsonb
    );

首先,您必須將數組元素作為單獨的行獲取,以便能夠對它們進行排序(內部查詢data )。 然后,您必須重建 JSON object:

SELECT
    person_id,
    name,
    jsonb_build_object(
        'fields',
        jsonb_agg(element ORDER BY element->'position' DESC)
    )
FROM (
    SELECT
        person_id,
        name,
        jsonb_array_elements(field->'fields') AS element
    FROM person
) data
WHERE person_id = 42
GROUP BY
    person_id,
    name;

這將產生:

 person_id | name |                               jsonb_build_object
-----------+------+--------------------------------------------------------------------------------
        42 | foo  | {"fields": [{"name": "Mike", "position": 2}, {"name": "John", "position": 1}]}

暫無
暫無

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

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