【问题标题】:MySQL and JSON - transform array to rowsMySQL 和 JSON - 将数组转换为行
【发布时间】:2016-12-11 16:23:36
【问题描述】:

假设我们有以下变量:

SET @j = '[10, 20, {"a": "bbb"}]';

问题是如何将项目提取为行?

基本查询,如下所示:

SELECT JSON_EXTRACT(@j, '$');

返回与输入相同的值,但我想要这样的东西:

10
20
{"a", "bbb"}

如何做到这一点?

【问题讨论】:

  • AFAIK,在 mysql 中没有将 json 数组转换为行的函数,因为 mysql 不像 postgresql 那样具有 ARRAY 数据类型。
  • 是的,我知道。我可以创建带有循环的 SP 来遍历所有项目,但我希望有更简单的方法来做到这一点。

标签: mysql json


【解决方案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 Engine 摆脱内联序列表:

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

【讨论】:

    猜你喜欢
    • 2017-02-15
    • 2014-01-23
    • 2018-05-30
    • 1970-01-01
    • 2015-11-10
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    相关资源
    最近更新 更多