【问题标题】:read json array on mysql query在mysql查询上读取json数组
【发布时间】:2020-07-20 17:12:13
【问题描述】:

我知道问题的重复性的可能性,但我没有找到任何可以帮助我解决我的情况的东西。

我的 mysql 列上有这个 json:

[
  {
    "ddi": "55",
    "routing_id": "7",
    "price": {
      "mt": 0.0285,
      "mo": 0.0285
    }
  },
  {
    "ddi": "598",
    "routing_id": "10",
    "price": {
      "mt": 0.06,
      "mo": 0.06
    }
  }
]

当我执行以下查询时:

SELECT JSON_EXTRACT(my_column,'$[*].ddi') as ddi FROM my_table

我得到了结果:

["55", "598"]

我的问题是: 有一种方法可以在行上返回此数据而不是 json 数组? 喜欢:

Ddi
55
598

【问题讨论】:

  • 为什么需要这种格式的数据?获取 json 数据后,您可以根据需要操作该数据
  • 嗨@AbuSufian 也许我对这样做的方式有误,但是有了这些数据,我假装在另一个表上进行了 INNER JOIN”,以通过 ddi 获取国家/地区名称。我正在尝试通过一个查询来执行此操作,而不是操纵 json 并执行另一个查询。
  • 如果您需要访问 JSON 中的各个字段以进行连接,这是数据库设计的危险信号。您应该以规范化的方式构造数据,而不是使用 JSON。
  • @BillKarwin 嗯好的...根据您的评论,更好的方法是操作 json,然后进行新的查询以实现我的意图,对吗?
  • 我不是这个意思。我的意思是如果您想稍后查询单个元素,请不要使用 JSON 来存储结构化数据。使用普通的列和行。在这种情况下,您需要一个表,每个 ddi 有一行,另一个表每个 ddi 的每个价格一行。使用 JSON 可以方便地一次性存储复杂的嵌套数据结构,但您的问题是一个示例,说明以 JSON 格式而不是普通格式存储数据会使以后的查询变得更难。跨度>

标签: mysql arrays json json-extract


【解决方案1】:

你也可以使用JSON_TABLE

SELECT get_ddi.* 
FROM my_table, 
     JSON_TABLE(my_column, '$[*]' COLUMNS (
                my_column VARCHAR(40)  PATH '$.ddi')
     ) get_ddi;
**Schema (MySQL v8.0)**

    DROP TABLE IF EXISTS `my_table`;
    
    CREATE TABLE IF NOT EXISTS `my_table` (
      `id` SERIAL,
      `my_column` JSON
    );
    
    INSERT INTO `my_table` (`id`, `my_column`)
    VALUES
      (1, '[
      {
        "ddi": "55",
        "routing_id": "7",
        "price": {
          "mt": 0.0285,
          "mo": 0.0285
        }
      },
      {
        "ddi": "598",
        "routing_id": "10",
        "price": {
          "mt": 0.06,
          "mo": 0.06
        }
      }
    ]');

**Query #1**

    SELECT get_ddi.* 
    FROM my_table, 
         JSON_TABLE(my_column, '$[*]' COLUMNS (
                    my_column VARCHAR(40)  PATH '$.ddi')
         ) get_ddi;

**Output**

| my_column |
| --------- |
| 55        |
| 598       |


根据下面的@Guilherme Mascarenhas cmets,所需的解决方案是 MariaDb。从版本 10.2.31 开始,MariaDB 不存在 JSON_TABLE 函数。 一个 hacky 解决方案可能是使用适当的 mariadb 序列表(取决于行数)。 JSON_UNQUOTE 从提取的值中删除引号。 seq 用作索引,从数组中获取指定的ddi 值。

SELECT 
    JSON_UNQUOTE(JSON_EXTRACT(t.my_column, CONCAT('$[', seq_0_to_100.seq, '].ddi'))) AS getddi
FROM my_table t
JOIN seq_0_to_100
HAVING getddi IS NOT NULL;

**Output**

| my_column |
| --------- |
| 55        |
| 598       |

【讨论】:

  • 错误代码:1064。您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在 '(my_column, '$[*]' COLUMNS ( my_column VARCHAR(40) PATH '$.' at line 3 0.156 sec I'm using: Mysql MariaDB 版本 10.2.31
  • 您没有在问题中标记或提及 MariaDB。上述解决方案适用于 MySQL v8.0 。 MariaDB 没有 JSON_TABLE 函数。将更新 MariaDB 的帖子。
  • @Guilherme Mascarenhas:MariaDb 的解决方案对您有用吗?
  • 就像一个魅力!我不知道 MariaDB 上的序列函数...对于任何想要了解更多详细信息的人>mariadb.com/kb/en/sequence-storage-engine
猜你喜欢
  • 2018-02-23
  • 2018-04-18
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2014-08-17
  • 2022-01-07
  • 2020-10-06
  • 2022-01-23
相关资源
最近更新 更多