Let's say I have a MySQL table like this:
This table can be created by
CREATE TABLE `MyTable` (
`JsonData` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`ExtractedData` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL
);
INSERT INTO MyTable (JsonData, ExtractedData)
VALUES ('[10, 20, 30]', NULL);
INSERT INTO MyTable (JsonData, ExtractedData)
VALUES ('["a", "b"]', NULL);
INSERT INTO MyTable (JsonData, ExtractedData)
VALUES ('["q", "w", "e", "r"]', NULL);
ExtractedData
select @len := JSON_LENGTH(JsonData) from MyTable;
JsonData
UPDATE MyTable SET ExtractedData = JSON_EXTRACT(JsonData, '$[0]');
JsonData
ExtractedData
ExtracedData
UPDATE MyTable SET ExtractedData = JSON_EXTRACT(JsonData, '$[@len-2]');
@len
here is a table. You can't automap it to each update row.
You need to inline the length, e.g.
UPDATE MyTable SET ExtractedData = JSON_EXTRACT(JsonData, CONCAT('$[',JSON_LENGTH(JsonData)-1,']'));
Check the fiddle at https://www.db-fiddle.com/f/6PC2CaBxwDdfpruECqAjGR/1