假设我们有以下变量:
SET @j = '[10, 20, {"a": "bbb"}]';
问题是如何将项目提取为行?
基本查询,如下所示:
SELECT JSON_EXTRACT(@j, '$');
返回与输入相同的值,但我希望得到类似的内容:
10
20
{"a", "bbb"}
怎么做?
答案 0 :(得分:1)
以下是将数组转换为行的三种方法。使用相同的假定JSON值:
SET @j = '[10, 20, {"a": "bbb"}]';
使用嵌入式数字表。 MySQL和MariaDB兼容:
WITH sequenceGenerator (sequenceNumber) AS (
SELECT 0 AS sequenceNumber
UNION ALL
SELECT 1
UNION ALL
SELECT 2
)
SELECT
JSON_EXTRACT(@j, CONCAT('$[', sequenceNumber, ']')) AS arrayValue
FROM
sequenceGenerator;
使用MySQL 8.0.4+ JSON_TABLE():
SELECT
arrayValue
FROM
JSON_TABLE(
@j,
'$[*]'
COLUMNS(
arrayValue JSON PATH '$')
) AS tt;
使用MariaDB SEQUENCE引擎摆脱内联序列表:
SELECT
JSON_EXTRACT(@j, CONCAT('$[', seq, ']')) AS arrayValue
FROM
seq_0_to_2;
要使MariaDB更通用,请对数组长度使用“最佳猜测”最大值,然后将序列限制为JSON长度。此示例假定最大的数组将包含1024个或更少的元素:
SELECT
JSON_EXTRACT(@j, CONCAT('$[', seq, ']')) AS arrayValue
FROM
seq_0_to_1024 AS sequenceTable
WHERE
sequenceTable.seq < JSON_LENGTH(@j);