Это было бы проще, если бы вы сделали $.emp_sheet
массив JSON в punch in:
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"}