MariaDB:对 JSON 中的值求和
MariaDB: sum values from JSON
我想从以下示例数据的 JSON 片段中总结某些值:
set @json='
{
"items": [
{
"a": {
"a_amount": "0.0020095"
},
"b": {
"b_amount": "0.0004"
}
},
{
"a": {
"a_amount": "0.02763081"
},
"b": {
"b_amount": "0.0055"
}
}
]
}';
我需要独立地对所有 a.a_amount
和所有 b.b_amount
求和,所以我想做类似 SUM(a.a_amount)
和 SUM(b.b_amount)
的事情。
但除了像这样提取各自的值之外,我没有得到任何进一步的信息:
SELECT JSON_EXTRACT(@json, '$.items[*].a.a_amount') AS sum_a,
JSON_EXTRACT(@json, '$.items[*].b.b_amount') AS sum_b;
sum_a
sum_b
["0.0020095", "0.02763081"]
["0.0004", "0.0055"]
我摆弄过 JSON_EXTRACT()
、JSON_VALUE()
甚至 ha_connect
插件,但仍然无法想出 SQL 代码来我需要的金额。
谁能帮帮我?
JSON Table 函数可以帮到您。这是您的数据的一个小例子。也许您必须稍微了解一下数据类型。
SELECT
SUM(a_amount),
SUM(b_amount)
FROM
(
SELECT * FROM
JSON_TABLE(@json, '$.items[*]' COLUMNS(
a_amount FLOAT PATH '$.a.a_amount',
b_amount FLOAT PATH '$.b.b_amount'
)
) as items
) as temp;
SUM(a_amount)
SUM(b_amount)
0.029640309745445848
0.005899999960092828
一个选项是通过使用 JSON_EXTRACT()
函数(例如
)来使用 DOUBLE 转换和 递归 CTE
WITH RECURSIVE cte AS
(
SELECT 0 i
UNION ALL
SELECT i + 1 i
FROM cte
WHERE i + 1 <= ( SELECT JSON_LENGTH(json) FROM j )
)
SELECT SUM(CAST(JSON_EXTRACT(json, CONCAT('$.items[',i,'].a.a_amount')) AS DOUBLE)) AS sum_a,
SUM(CAST(JSON_EXTRACT(json, CONCAT('$.items[',i,'].b.b_amount')) AS DOUBLE)) AS sum_b
FROM cte,
j
sum_a
sum_b
0.02964031
0.0059
我想从以下示例数据的 JSON 片段中总结某些值:
set @json='
{
"items": [
{
"a": {
"a_amount": "0.0020095"
},
"b": {
"b_amount": "0.0004"
}
},
{
"a": {
"a_amount": "0.02763081"
},
"b": {
"b_amount": "0.0055"
}
}
]
}';
我需要独立地对所有 a.a_amount
和所有 b.b_amount
求和,所以我想做类似 SUM(a.a_amount)
和 SUM(b.b_amount)
的事情。
但除了像这样提取各自的值之外,我没有得到任何进一步的信息:
SELECT JSON_EXTRACT(@json, '$.items[*].a.a_amount') AS sum_a,
JSON_EXTRACT(@json, '$.items[*].b.b_amount') AS sum_b;
sum_a | sum_b |
---|---|
["0.0020095", "0.02763081"] | ["0.0004", "0.0055"] |
我摆弄过 JSON_EXTRACT()
、JSON_VALUE()
甚至 ha_connect
插件,但仍然无法想出 SQL 代码来我需要的金额。
谁能帮帮我?
JSON Table 函数可以帮到您。这是您的数据的一个小例子。也许您必须稍微了解一下数据类型。
SELECT
SUM(a_amount),
SUM(b_amount)
FROM
(
SELECT * FROM
JSON_TABLE(@json, '$.items[*]' COLUMNS(
a_amount FLOAT PATH '$.a.a_amount',
b_amount FLOAT PATH '$.b.b_amount'
)
) as items
) as temp;
SUM(a_amount) | SUM(b_amount) |
---|---|
0.029640309745445848 | 0.005899999960092828 |
一个选项是通过使用 JSON_EXTRACT()
函数(例如
WITH RECURSIVE cte AS
(
SELECT 0 i
UNION ALL
SELECT i + 1 i
FROM cte
WHERE i + 1 <= ( SELECT JSON_LENGTH(json) FROM j )
)
SELECT SUM(CAST(JSON_EXTRACT(json, CONCAT('$.items[',i,'].a.a_amount')) AS DOUBLE)) AS sum_a,
SUM(CAST(JSON_EXTRACT(json, CONCAT('$.items[',i,'].b.b_amount')) AS DOUBLE)) AS sum_b
FROM cte,
j
sum_a | sum_b |
---|---|
0.02964031 | 0.0059 |