Mysql 提取计算出的JSONpath响应的第一个元素

Mysql 提取计算出的JSONpath响应的第一个元素,mysql,json,jsonpath,Mysql,Json,Jsonpath,如果我有以下JSON数据: { "providers": { "abc": { "provider": "foo", "token": "abc123" }, "def": { "provider": "bar", "token": "def567" } } } 我想找到一个JSON路径,它返回第一个提供者的令牌,即abc123。问题在于找到第一个,因为提供程序是一个对象,而不是数组 我想我可以从$.pro

如果我有以下JSON数据:

{
  "providers": {
    "abc": {
      "provider": "foo",
      "token": "abc123"
    },
    "def": {
      "provider": "bar",
      "token": "def567"
    }
  }
}
我想找到一个JSON路径,它返回第一个提供者的令牌,即abc123。问题在于找到第一个,因为提供程序是一个对象,而不是数组

我想我可以从$.providers.*开始,它返回以下数组:

[
  {
    "provider": "foo",
    "token": "abc123"
  },
  {
    "provider": "bar",
    "token": "def567"
  }
]
但我似乎对这个数组无能为力。e、 g.$.providers.[0]不起作用

我所要求的可能吗?如果有必要的话,我将使用MySQL来实现这一点,尽管我正在寻找一个通用的JSONPath解决方案

select doc->>"$.providers.abc.provider" from x1;
+----------------------------------+
| doc->>"$.providers.abc.provider" |
+----------------------------------+
| foo                              |
+----------------------------------+
设置为1行0.0008秒


您的路径是providers.abc.provider

您需要使用传递的表/子查询来解析出所需的部分


是的,不过我不知道abc是第一家供应商

这将解析出第一个provider元素

质疑

结果


我最终使用MySQL 5.7解决了这个问题,这就是为什么我没有->>语法:


你期望的结果是什么?这个呢?你需要使用交付的表来解析它。预期的结果将是abc123。我回答了一个关于我的示例的更新,即输出abc123@ColinYes,除了我不知道abc是第一个提供程序之外。在这里遍历数组或使用如下内容并只处理第一个条目会更容易。选择doc->$.providers.*.provider from x1;+-------------+\124;doc->$.providers.*.provider |+---------------------+[foo,bar]|+-----------------------+1行,设置为0.0004 secUpvote,因为它可以工作,尽管我认为添加许多级别的子查询会很快变得无法管理。特别是如果您希望从表中选择JSON数据和其他数据。
SELECT 
 *
 , records_json_array.json_array->'$[0].token'
FROM (

SELECT 
 records.json->'$.providers.*' AS json_array
FROM (

SELECT 
 '{
  "providers": {
    "abc": {
      "provider": "foo",
      "token": "abc123"
    },
    "def": {
      "provider": "bar",
      "token": "def567"
    }
  }
}' AS json
FROM 
 DUAL
) AS records

) AS records_json_array
| json_array                                                                       | records_json_array.json_array->'$[0].token' |
| -------------------------------------------------------------------------------- | ---------------------------------------------- |
| [{"token": "abc123", "provider": "foo"}, {"token": "def567", "provider": "bar"}] | "abc123"                                       |
SET @j = '{
  "providers": {
    "abc": {
      "provider": "foo",
      "token": "abc123"
    },
    "def": {
      "provider": "bar",
      "token": "def567"
    }
  }
}';



SELECT JSON_UNQUOTE(
  JSON_EXTRACT(
    JSON_EXTRACT(@j, "$.providers.*"),
    "$[0].token"
  )
) AS token;