首页 > 解决方案 > MariaDB JSON 将数字添加到值

问题描述

我有表:

CREATE TABLE IF NOT EXISTS `t2` (
  `j` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`j`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t2` (`j`) VALUES
    ('{"sdsd": 123, "qqq": 456, "data": [{"www": 789, "eee": 98}, {"ddd": 578}]}');

并且需要将 json 值“www”更新为 +10。我尝试这样做:

UPDATE t2 set j = JSON_SET(j, "$.data[0].www", "$.data[0].www" +1) ;

但是得到一个错误:

SQL 错误 (1292):截断不正确的 DOUBLE 值:'$.data[0].www'

请帮忙,如何正确更新值?谢谢!

标签: sqlarraysjsonsql-updatemariadb

解决方案


您将 JSON 路径作为第三个参数提供给json_set(),而您的意思是检索存储在该路径中的值 - 为此,您可以使用json_extract()

update t2 
set j = json_set(
    j, 
    '$.data[0].www', 
    json_extract(j, '$.data[0].www') + 1 
);

DB Fiddlde 上的演示

| j |
| :------------------------------------------------ ------------------------------------ |
| {“sdsd”:123,“qqq”:456,“数据”:[{“www”:790,“eee”:98},{“ddd”:578}]} |

注意:这是有效的,因为您的数值是 JSON 数字(也就是说,它们没有用双引号括起来)。如果你有 JSON 字符串,那么你需要先取消引用它们:

update t2 
set j = json_set(
    j, 
    '$.data[0].www', 
    json_unquote(json_extract(j, '$.data[0].www')) + 1 
);

推荐阅读