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

View on DB Fiddle

一个选项是通过使用 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

Demo