如何在MySQL中结合JSON_LENGTH和JSON_EXTRACT?

时间:2017-10-01 08:14:25

标签: mysql json

假设我有一个像这样的MySQL表:

enter image description here

此表可由

创建
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);

如何将json数据的倒数第二个元素复制到ExtractedData

我的意思是我想更新表格,看起来像这样:

enter image description here

我发现select @len := JSON_LENGTH(JsonData) from MyTable;能够获得每个JsonData的长度。

我还发现UPDATE MyTable SET ExtractedData = JSON_EXTRACT(JsonData, '$[0]');能够将JsonData的第一个元素复制到ExtractedData

如何组合2个命令,以便将最后一个元素复制到ExtracedData

UPDATE MyTable SET ExtractedData = JSON_EXTRACT(JsonData, '$[@len-2]');不起作用。

2 个答案:

答案 0 :(得分:2)

如果使用MySQL 8.0,则可以使用以下内容提取第二个json项:

JSON_EXTRACT(JsonData, '$[last-1]');

如此处所述:11.6 The Json Data Type

答案 1 :(得分:1)

@len这是一张桌子。您无法将其自动化到每个更新行。

您需要内联长度,例如

UPDATE MyTable SET ExtractedData = JSON_EXTRACT(JsonData, CONCAT('$[',JSON_LENGTH(JsonData)-1,']'));

https://www.db-fiddle.com/f/6PC2CaBxwDdfpruECqAjGR/1

处查看小提琴