查询从 JSONB 列中提取特定值

问题描述 投票:0回答:1

我正在创建一个 PostgreSQL 查询来解决以下场景:

  • 我有一列数据类型为 jsonb。
  • 此列中有 4 个属性,其中两个是数字,另外 2 个是包含具有两个属性的对象的数组:值和描述。
  • 例如:
"info_column": {
"attribute1": 10, 
"attribute2": 50, 
"attribute3": [
{"value": 10, "description": "desc1"},
{"value": 20, "description": "desc2"},
{"value": 30, "description": "desc3"}
], 
"attribute4": [
{"value": 40, "description": "desc4"},
{"value": 50, "description": "desc5"},
{"value": 60, "description": "desc6"}
]
}
  • 目标是获得每个寄存器的
    attribute1
    attribute2
    attribute3
    attribute4
    之和。
    • 对于
      attribute1
      attribute2
      ,总和将是它们显示为其属性值的数字。
    • 在其他情况下,总和将对应于其属性数组中所有对象中每个
      value
      的总和。
  • 上述数据所需的输出如下所示:
    |  attribute1| attribute2| attribute3| attribute4
row1|          10|         50|         60|        150

我非常感谢您就此事提供的任何帮助。

sql database postgresql subquery
1个回答
0
投票
Hope below query can help 
consider your PostgreSQL table name student_info and field meta_data contain your json then below query can give your expected result 

SELECT
    (
        CASE
            WHEN JSON_TYPEOF(meta_data->'info_column'->>'attribute1') = 'array'
                THEN (
                    SELECT SUM(value::integer) AS sum_of_attribute1
                    FROM (
                        SELECT json_array_elements_text(meta_data->'info_column'->'attribute1')->>'value' AS value
                    ) attribute1_sum
                )
            ELSE
                (meta_data->'info_column'->>'attribute1')::integer
        END
    ) AS attribute1,

    (
        CASE
            WHEN JSON_TYPEOF(meta_data->'info_column'->>'attribute2') = 'array'
                THEN (
                    SELECT SUM(value::integer) AS sum_of_attribute2
                    FROM (
                        SELECT json_array_elements_text(meta_data->'info_column'->'attribute2')->>'value' AS value
                    ) attribute2_sum
                )
            ELSE
                (meta_data->'info_column'->>'attribute2')::integer
        END
    ) AS attribute2,

    (
        CASE
            WHEN JSON_TYPEOF(meta_data->'info_column'->'attribute3') = 'array'
                THEN (
                    SELECT SUM(value::integer) AS sum_of_attribute3
                    FROM (
                        SELECT json_array_elements_text(meta_data->'info_column'->'attribute3')->>'value' AS value
                    ) attribute3_sum
                )
            ELSE
                meta_data->'info_column'->>'attribute3'
        END
    ) AS attribute3,

    (
        CASE
            WHEN JSON_TYPEOF(meta_data->'info_column'->'attribute4') = 'array'
                THEN (
                    SELECT SUM(value::integer) AS sum_of_attribute4
                    FROM (
                        SELECT json_array_elements_text(meta_data->'info_column'->'attribute4')->>'value' AS value
                    ) attribute4_sum
                )
            ELSE
                meta_data->'info_column'->>'attribute4'
        END
    ) AS attribute4
FROM student_info
WHERE meta_data IS NOT NULL;
 
© www.soinside.com 2019 - 2024. All rights reserved.