【问题标题】:Updating a stored JSON in Mysql Database更新 MySQL 数据库中存储的 JSON
【发布时间】:2020-06-22 07:54:19
【问题描述】:

我正在尝试更新我的数据库中的存储 JSON,但我无法运行以下更新查询。我在下面复制了一条选择语句和一条更新语句

SELECT 
`core_animal_event`. `animal_id` AS `MilkingEvent_animalID`, 
JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."62"')) AS `MilkingEvent_milkCompositeLitres`, 
coalesce(JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."68"')) + 
JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."61"')) +
JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."59"')))
FROM `core_animal_event` WHERE (`core_animal_event`. `event_type` = 2) AND (`core_animal_event`. `country_id` = '10');

UPDATE `core_animal`
SET
JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."62"'))  = 
coalesce(JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."68"')) + 
JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."61"')) +
JSON_UNQUOTE(JSON_EXTRACT(`core_animal_event`.`additional_attributes`, '$."59"')))
 WHERE (`core_animal_event`. `event_type` = 2) AND (`core_animal_event`. `country_id` = '10')

以下是示例数据,我们从中存储了一个名为 additional_attribute 和 animal_id 的 JSON 列,这是唯一的

# animal_id, additional_attributes
'2576', '{\"59\": null, \"61\": null, \"62\": null, \"63\": null, \"64\": null, \"65\": null, \"66\": null, \"67\": null, \"68\": null, \"69\": \"1\", \"70\": \"2\", \"71\": \"1\", \"72\": null, \"73\": \"2\", \"74\": \"1\", \"75\": null, \"76\": null, \"77\": [\"1\"], \"78\": \"32\", \"79\": \"70\", \"80\": \"4\", \"81\": null, \"82\": null, \"83\": null, \"84\": \"Mkiwa\", \"85\": \"19280\", \"86\": \"2405\", \"87\": \"TNZ000192802405\", \"88\": \"Brownwhite\", \"89\": \"1565789020239.jpg\", \"90\": \"1565789049469.jpg\", \"96\": null, \"97\": null, \"98\": null, \"99\": \"1\", \"100\": null, \"101\": null, \"102\": null, \"103\": null, \"104\": null, \"105\": null, \"106\": null, \"107\": null, \"108\": null, \"109\": null, \"110\": null, \"111\": null, \"112\": null, \"113\": null, \"114\": null, \"115\": null, \"116\": null, \"117\": null, \"118\": null, \"119\": null, \"120\": null, \"121\": null, \"122\": null, \"123\": null, \"124\": null, \"125\": null, \"126\": null, \"127\": null, \"128\": null, \"129\": null, \"130\": null, \"131\": null, \"132\": null, \"133\": null, \"134\": null, \"135\": null, \"136\": null, \"137\": null, \"138\": null, \"139\": null, \"141\": null, \"142\": null, \"143\": null, \"144\": null, \"145\": null}'

以下是创建语句的示例

CREATE TABLE `core_animal_event` (
  `id` int NOT NULL AUTO_INCREMENT,
  `animal_id` int NOT NULL,
  `event_type` int NOT NULL,
  `additional_attributes` json DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `org_id` (`country_id`),
  KEY `animal_id` (`animal_id`),
  KEY `event_type` (`event_type`),
  CONSTRAINT `core_animal_event_ibfk_1` FOREIGN KEY (`animal_id`) REFERENCES `core_animal` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=941817 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT;

【问题讨论】:

  • 为 CREATE TABLE + INSERT INTO 脚本提供样本数据(足够 3-4 条记录)和该数据的预期结果。
  • @Akina 我已经做了 create 语句 insert 语句虽然不包括在内
  • 如果您提供源数据示例和所需结果,那么任何想帮助您的人都可以检查建议的解决方案是否给出了正确的结果。
  • 附言。 COALESCE(val1 + val2 + val3) 是错误的。任何情况下都会返回val1 + val2 + val3,即使它是NULL。

标签: mysql


【解决方案1】:

这里不需要转义字符。我什至认为他们可能是问题的根源。

这是我的测试代码:

CREATE TABLE `core_animal_event` (
  `animal_id` int(11) NOT NULL AUTO_INCREMENT,
  `additional_attributes` json DEFAULT NULL,
  `event_type` int(11) NOT NULL,
  `country_id` int(11) NOT NULL,
  PRIMARY KEY (`animal_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1

INSERT INTO core_animal_event
(animal_id, additional_attributes, event_type, country_id)
VALUES(1, '{ "59": null, "61": null, "62": null, "63": null, "64": null, "65": null, "66": null, "67": null, "68": null, "69": "1", "70": "2", "71": "1", "72": null, "73": "2", "74": "1", "75": null, "76": null, "77": ["1"], "78": "32", "79": "70", "80": "4", "81": null, "82": null, "83": null, "84": "Mkiwa", "85": "19280", "86": "2405", "87": "TNZ000192802405", "88": "Brownwhite", "89": "1565789020239.jpg", "90": "1565789049469.jpg", "96": null, "97": null, "98": null, "99": "1", "100": null, "101": null, "102": null, "103": null, "104": null, "105": null, "106": null, "107": null, "108": null, "109": null, "110": null, "111": null, "112": null, "113": null, "114": null, "115": null, "116": null, "117": null, "118": null, "119": null, "120": null, "121": null, "122": null, "123": null, "124": null, "125": null, "126": null, "127": null, "128": null, "129": null, "130": null, "131": null, "132": null, "133": null, "134": null, "135": null, "136": null, "137": null, "138": null, "139": null, "141": null, "142": null, "143": null, "144": null, "145": null}', 2, 10);

没有转义字符 \,您的 SELECT 查询可以工作。

对于您的更新,这是一个示例:

UPDATE core_animal_event
SET additional_attributes = json_set(additional_attributes, '$."62"',
        COALESCE(JSON_UNQUOTE(JSON_EXTRACT(additional_attributes, '$."68"')) + 
            JSON_UNQUOTE(JSON_EXTRACT(additional_attributes, '$."61"')) +
            JSON_UNQUOTE(JSON_EXTRACT(additional_attributes, '$."59"')))
        )
WHERE (event_type = 2) AND (country_id = '10');

//-------

编辑: 使用 JSON_EXTRACT 和 COALESCE 函数时要小心,如果所有值都为 null,则返回值为 0,而不是 null 值。

编辑 2: Akina 是对的,你的 COALESCE 功能不好......正如你所做的那样,这是一个补充(但也许这就是你想要的......)

编辑 3: 如果你想使用 COALESCE,这里有一个例子:

SELECT animal_id AS colID, JSON_UNQUOTE(JSON_EXTRACT(additional_attributes, '$."62"')) AS col62, 
COALESCE (
    IF(JSON_TYPE(JSON_EXTRACT(additional_attributes, '$."68"'))='NULL', null, JSON_EXTRACT(additional_attributes, '$."68"')),
    IF(JSON_TYPE(JSON_EXTRACT(additional_attributes, '$."59"'))='NULL', null, JSON_EXTRACT(additional_attributes, '$."59"')),
    IF(JSON_TYPE(JSON_EXTRACT(additional_attributes, '$."61"'))='NULL', null, JSON_EXTRACT(additional_attributes, '$."61"'))
) AS result_of_coalesce
FROM core_animal_event WHERE (event_type = 2) AND (country_id = '10');

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 2023-03-05
    • 2013-03-01
    • 2020-06-07
    • 2015-04-12
    • 1970-01-01
    • 2018-02-16
    • 2012-05-06
    • 2021-05-17
    相关资源
    最近更新 更多