MySQL JSON столбец добавить новый массив в качестве элемента - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть таблица со столбцом типа JSON, я хочу обновить столбец с новым элементом массива в существующем JSON.

Что необходимо сделать: добавить массив в столбце JSON, когда сотрудник punch_in, и добавить еще один массив в столбце JSON, когда сотрудник punch_out.

{"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","result":1,"applytime":"2018-04-12 04:50:39"}"}

Пожалуйста, помогите мне написать запрос на обновление сотрудника punch_out.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Это было бы проще, если бы вы сделали $.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"}
0 голосов
/ 28 апреля 2018

Попробуйте использовать JSON_ARRAY_APPEND вместо JSON_SET.

Руководство - https://dev.mysql.com/doc/refman/8.0/en/json-modification-functions.html

Я думаю, что это может быть так

rule_codes = JSON_ARRAY_APPEND(COALESCE(rule_codes, '{"emp_sheet":[]}'), '$.emp_sheet', '{"rulecode":"PUNCH_IN","result":1,"applytime":"2018-04-12 04:50:39"}')

или

rule_codes = IF(rule_codes IS NULL,'
    '{"emp_sheet":[{"rulecode":"PUNCH_IN","result":1,"applytime":"2018-04-12 04:50:39"}]}',
    JSON_ARRAY_APPEND(rule_codes, '$.emp_sheet', '{"rulecode":"PUNCH_IN","result":1,"applytime":"2018-04-12 04:50:39"}')
  )
...