簡體   English   中英

如何基於postgresql上的其他列求和查詢json數組對象

[英]How sum query json array object base on other column on postgresql

我使用 postgres 14.2 並有 3 列示例namename_addsaditional

並有規則:

  1. namename_adds可以填充相同的值,也可以不填充。 示例 -> name (john)name_adds (doe)或兩者的值都是(john)
  2. 附加列可以是下面的 2 格式值
  • 第一個值可以是
{"default":[{"value_1": 100, "value_2": 0.1},{"value_1": 200, "value_2": 0.2}], 
 "non_default":[{"value_1": 200, "value_2": 0.1}, {"value_1": 400, "value_2": 0.1}]}
  • 第二個值可以是
[
{
    "value_1": 10,
    "value_2": 11
},
{
    "value_1": 1,
    "value_2": 19
}
]
  1. 總結默認值 -> value_1 ( name == name_adds )
  2. 總結 non_default -> value_1 ( name != name_adds )

如何根據規則點 3 和 4 在點 2 上對格式 1 或 2 求和。對於如下邏輯

if (name == name_adds) {
    if (additional contain default) {
       sum (default->value_1)
    } else {
       // format 2.2
       sum (value_1)
    }
} else {
    if (additional contain non_default) {
       sum (default->value_1)
    } else {
       // format 2.2
       sum (value_1)
    }
}

預期結果:

桌子上的例子,假設我有如下表

name    name_adds   additional
---------------------------------------------------------------
john    john      {"default":[{"value_1": 100, "value_2": 0.1}, 
                  {"value_1": 200, "value_2": 0.2}],"non_default": 
                  [{"value_1": 200, "value_2": 0.1}, {"value_1": 400, 
                   "value_2": 0.1}]}

john     doe     {"default":[{"value_1": 100, "value_2": 0.1}, 
                  {"value_1": 200, "value_2": 0.2}],"non_default": 
                  [{"value_1": 200, "value_2": 0.1}, {"value_1": 400, 
                   "value_2": 0.1}]}

downy    downy    [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]

downy    dan      [{"value_1": 10, "value_2": 11},{"value_1": 1,"value_2": 19}]

和預期的表為

name    name_adds   sum_result
---------------------------------------------------------------
john    john        300

john     doe        600

downy    downy      11

downy    dan        11

我做了下面的演示鏈接,但仍然沒有達到預期的演示

with cte as (
        select
            name,
            name_adds,
            (name = name_adds) name_as_adds,
            jsonb_path_query(additional,'$.default[*].value_1') ::numeric with_default
            ,jsonb_path_query(additional,'$.non_default[*].value_1')::numeric with_no_default
            ,jsonb_path_query(additional,'$[*].value_1')::numeric as ignore_defaults
from test_json),
cte2 as (
    select
        name, name_adds,
        case when ignore_defaults is null and name_as_adds then with_default
             when ignore_defaults is null and name_as_adds is false then with_no_default
             when ignore_defaults is not null then ignore_defaults
        end as cases
    from cte)
select name, name_adds, sum(cases) as sum_result from cte2 group by 1, 2 order by 1 desc;

暫無
暫無

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

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