在mysql查询上读取json数组

Gui*_*has 4 mysql arrays json json-extract

我知道问题可能存在口是心非的可能性,但我没有找到任何东西可以帮助我解决我的情况。

我的 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
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

当我执行以下查询时:

[
  {
    "ddi": "55",
    "routing_id": "7",
    "price": {
      "mt": 0.0285,
      "mo": 0.0285
    }
  },
  {
    "ddi": "598",
    "routing_id": "10",
    "price": {
      "mt": 0.06,
      "mo": 0.06
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

我得到结果:

["55", "598"]
Run Code Online (Sandbox Code Playgroud)

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

Ddi
55
598
Run Code Online (Sandbox Code Playgroud)

Rah*_*ngh 8

您可以使用JSON_TABLE相同的

SELECT get_ddi.* 
FROM my_table, 
     JSON_TABLE(my_column, '$[*]' COLUMNS (
                my_column VARCHAR(40)  PATH '$.ddi')
     ) get_ddi;
Run Code Online (Sandbox Code Playgroud)
**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       |


Run Code Online (Sandbox Code Playgroud)

根据@Guilherme Mascarenhas 下面的评论,所需的解决方案是 MariaDb。从版本 10.2.31 开始,JSON_TABLEMariaDB 不存在该函数。一个 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       |

Run Code Online (Sandbox Code Playgroud)