MySQL JSON 列添加新数组作为元素

标签 mysql mysql-json

我有一个包含 JSON 类型列的表,我想用现有 JSON 中的新数组元素更新列。

需要做什么:当员工punch_in时在JSON列中添加一个数组,当员工punch_out时在JSON列中添加另一个数组。

{"emp_sheet":[{"rulecode":"PUNCH_IN","result":1,"applytime":"2018-04-12 04:50:39"},{"rulecode":"PUNCH_OUT","result":1,"applytime":"2018-04-12 13:01:39"}]}

我为员工punch_in做了什么:

UPDATE table 
SET rule_codes = JSON_SET(COALESCE(rule_codes, '{}'), '$.emp_sheet', '{"rulecode":"PUNCH_IN","result":1,"applytime":"2018-04-12 04:50:39"}') 
WHERE emp_id = 1

rule_codes 列中的结果 =

{"emp_sheet": "{"rulecode":"PUNCH_IN","re​​sult":1,"applytime":"2018-04-12 04:50:39"}"}

请帮我编写员工punch_out的更新查询。

最佳答案

如果您在打入时将 $.emp_sheet 设为 JSON 数组,这将是最简单的:

UPDATE table3
SET rule_codes = JSON_SET(COALESCE(rule_codes, JSON_OBJECT('emp_sheet', JSON_ARRAY())), 
                          '$.emp_sheet[0]', 
                          '{"rulecode":"PUNCH_IN","result":1,"applytime":"2018-04-12 04:50:39"}') 
WHERE emp_id = 1

然后在打洞时,您可以向数组添加另一个元素:

UPDATE table3
SET rule_codes = JSON_SET(COALESCE(rule_codes, JSON_OBJECT('emp_sheet', JSON_ARRAY())),
                          '$.emp_sheet[1]',
                          '{"rulecode":"PUNCH_OUT","result":1,"applytime":"2018-04-12 13:01:39"}') 
WHERE emp_id = 1;

SELECT rule_codes FROM table3 WHERE emp_id = 1

输出:

{"emp_sheet": [
    "{\"rulecode\":\"PUNCH_IN\",\"result\":1,\"applytime\":\"2018-04-12 04:50:39\"}", 
    "{\"rulecode\":\"PUNCH_OUT\",\"result\":1,\"applytime\":\"2018-04-12 13:01:39\"}"
 ]}

请注意,当您执行 SET 操作时,输入 JSON ('{"rulecode ... }') 会被视为字符串,因此会出现转义的 "上面的输出。您可以在提取时使用 JSON_UNQUOTE 删除它们,即

SELECT JSON_UNQUOTE(JSON_EXTRACT(rule_codes, '$.emp_sheet[0]')) FROM `table3` 

或使用快捷符号

SELECT rule_codes->>'$.emp_sheet[0]' FROM `table3` 

输出:

{"rulecode":"PUNCH_IN","result":1,"applytime":"2018-04-12 04:50:39"}

关于MySQL JSON 列添加新数组作为元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50073339/

相关文章:

MySQL JSON 数组用于 "IN"子句?

MySQL删除删除错误的条目

mysql - 使用 DATETIME mysql 查询日期之间的时间范围

MySQL JSON : How to find object from key value

MySQL 5.7.8 JSON 合并新数据

Mysql:获取json数组长度并忽略空值

mysql - 选择没有年份的日期范围

mysql - 海蒂SQL : count all students in different courses

mysql - 选择表 A 中在表 B 中没有任何新记录的项目

mysql - 无法使用 JSON_CONTAINS 进行搜索