【问题标题】:mySQL json array reformattingmySQL json数组重新格式化
【发布时间】:2021-12-18 05:31:16
【问题描述】:

我有一个表,其中包含“所有者”列,其中包含 json 数据,如下所示:

[
   {
      "first":"bob",
      "last":"boblast"
   },
   {
      "first":"mary",
      "last": "marylast"
   }
]

我想编写一个查询,该查询将为包含此类数据的每一行返回一个包含所有名字与逗号连接的列。

id                owners
----------------------------
1                 bob,mary
2                 frank,tom

还没有在 mysql 8.0 上。

【问题讨论】:

    标签: mysql mysql-json


    【解决方案1】:

    您可以将值作为 JSON 数组获取:

    SELECT JSON_EXTRACT(owners, '$[*].first') AS owners ...
    

    但是以 JSON 数组格式返回:

    +-----------------+
    | owners          |
    +-----------------+
    | ["bob", "mary"] |
    +-----------------+
    

    JSON_UNQUOTE() 不会去掉括号和双引号。您必须使用 REPLACE(),正如我在最近的回答中所示:

    MYSQL JSON search returns results in square brackets

    如果它不支持您需要的查询方式,您应该考虑以 JSON 格式存储数据。

    【讨论】:

    • 我们不一定需要查询数据。我们考虑添加额外的表,但是当我们切换到 mysql 8 时,所有这些问题都随着 JSON_TABLE 而消失,这将允许我们使用 GROUP_CONCAT。
    • JSON_UNQUOTE 只是 MariaDB 吗?
    • @bpeikes 我会留给你在 MySQL 中的 JSON 函数参考中查找它。
    • 奇怪,当我第一次搜索 JSON_UNQUOTE 时,我只看到了对 MariaDB 的引用,现在我在 mysql 文档中看到了。
    【解决方案2】:

    这是另一种选择,获取一个运行数字达到最大 json 数组长度的辅助表,并按单个索引提取值,然后 group_concat 值,如下所示:

    SELECT g.id, GROUP_CONCAT(g.name)
    FROM (
        SELECT a.id, JSON_UNQUOTE(JSON_EXTRACT(a.owners, CONCAT('$[', n.idx, '].first'))) name
        FROM running_numbers n
        JOIN mytable a
    ) g
    GROUP BY g.id
    

    https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=d7453c9edf89f79ca4ab2f63578b320c

    【讨论】:

      猜你喜欢
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      相关资源
      最近更新 更多