Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Postgresql中对JSONB数组中的值求和?_Sql_Postgresql_Psql_Jsonb - Fatal编程技术网

如何在Postgresql中对JSONB数组中的值求和?

如何在Postgresql中对JSONB数组中的值求和?,sql,postgresql,psql,jsonb,Sql,Postgresql,Psql,Jsonb,在表中的jsonb列p06中给出了以下数据ryzom\u characters: -[ RECORD 1 ]--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在表中的jsonb列
p06
中给出了以下数据
ryzom\u characters

        -[ RECORD 1 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    p06 | {
  "id": 675010,
  "cname": "Bob",
  "rpjobs": [
    {
      "progress": 25
    },
    {
      "progress": 13
    },
    {
      "progress": 30
    }
  ]
}
我正在尝试对
进度
的值求和。我尝试了以下几点:

    SELECT 
c.cname AS cname,
jsonb_array_elements(c.p06->'rpjobs')::jsonb->'progress' AS value 
FROM ryzom_characters c
Where cid = 675010
ORDER BY value DESC 
LIMIT 50;
其中正确列出了值:

 cname  | value
--------+-------
 Savisi | 30
 Savisi | 25
 Savisi | 13
(3 rows)
但现在我想对这些值求和,它们可以是null

如何对数组中的对象字段正确求和

以下是表格结构:

                     Table "public.ryzom_characters"
    Column     |          Type          | Collation | Nullable | Default
---------------+------------------------+-----------+----------+---------
 cid           | bigint                 |           |          |
 cname         | character varying(255) |           | not null |
 p06           | jsonb                  |           |          |
 x01           | jsonb                  |           |          |

函数
jsonb\u array\u elements()
是一个集合返回函数。因此,您应该将其用作行源(在
FROM
子句中)。调用之后,您将得到一个表,其中每一行都包含一个数组元素。从那以后就相对容易了

SELECT cname, 
       sum(coalesce(r.prog->>'progress'::int, 0)) AS value  
FROM ryzom_characters c,
     jsonb_array_elements(c.p06->'rpjobs') r (prog)
WHERE c.cid = 675010
GROUP BY cname 
ORDER BY value DESC 
LIMIT 50;

在from子句的横向联接中使用函数
jsonb\u array\u elements()

select cname, sum(coalesce(value, '0')::int) as value
from (
    select 
        p06->>'cname' as cname, 
        value->>'progress' as value
    from ryzom_characters
    cross join jsonb_array_elements(p06->'rpjobs')
    where cid = 675010
    ) s
group by cname
order by value desc 
limit 50;
可以使用左连接而不是交叉连接来保护查询不受不一致数据的影响:

    left join jsonb_array_elements(p06->'rpjobs')
    on jsonb_typeof(p06->'rpjobs') = 'array'
    where p06->'rpjobs' <> 'null'
left join jsonb_数组_元素(p06->'rpjobs')
关于jsonb_typeof(p06->'rpjobs')='array'
其中p06->“rpjobs”“null”

数据结构不清晰。请编辑问题并添加表定义(\d ryzom\u psql中的字符)。@klin I添加了表结构。这会产生错误:
错误:合并类型jsonb和整数无法匹配
?这是一个类型转换错误。请参阅更新的答案。我得到错误:
错误:整数的输入语法无效:“progress”
?这将表明
progress
包含一些非整数的数据。@cid是否可以对该查询进行限制?此外,cname是“ryzom_characters”表中的另一列,p06 jsonb sorry中没有元素可以更正描述。当然,您可以跳过该条件。然后,您可能希望(或不希望)添加列以选择列表,并在外部查询的
group by
子句中使用该列,具体取决于您的期望值。@I收到错误:无法从标量中提取元素。当我删除where子句时?嗯,您的数据不一致,在某些行中,
“rpjobs”
不是数组,在某些行中可能为空。有可能再次保护这一点吗?