给定表ryzom_characters
中的jsonb列p06
中的以下数据:
-[ RECORD 1 ]------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
p06 | {
"id": 675010,
"cname": "Bob",
"rpjobs": [
{
"progress": 25
},
{
"progress": 13
},
{
"progress": 30
}
]
}
我正在计算progress
的值。我尝试了以下操作:
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)
但现在我想对这些值求和,它可能为空。
如何正确地对数组中的对象字段求和?
下面是表格结构:
Table "public.ryzom_characters"
Column | Type | Collation | Nullable | Default
---------------+------------------------+-----------+----------+---------
cid | bigint | | |
cname | character varying(255) | | not null |
p06 | jsonb | | |
x01 | jsonb | | |
2条答案
按热度按时间pcrecxhr1#
在from子句的横向连接中使用函数
jsonb_array_elements()
:您可以使用左联接而不是交叉联接来保护查询不一致的数据:
f87krz0w2#
函数
jsonb_array_elements()
是一个返回集合的函数。因此,您应该将其用作行源(在FROM
子句中)。在调用之后,您将得到一个表,其中每一行都包含一个数组元素。从那以后就相对容易了。