使用common_schema提取值不适用于嵌套JSON

时间:2018-01-05 04:18:09

标签: mysql json common-schema

我有一个名为data的数据库字段是 MEDIUMTEXT ,它以JSON格式存储值。我使用extract_json_value中的common_schema方法。

当JSON没有嵌套时,它可以正常工作。例如,当applications_data表的data字段为

{
  "key": "value"
}

此查询正常工作:

SELECT data into @json from applications_data;
SELECT common_schema.extract_json_value(@json, 'key') as result;

并给出结果:key

但是,当数据字段是嵌套的JSON时,它会失败。例如,JSON是:

{
  "key": {
    "overview": "sample"
  }
}

使用与上面相同的查询,结果为空,而不是NULL:

enter image description here

1 个答案:

答案 0 :(得分:1)

记住:

  

extract_json_value

     

...

     

此功能内部依赖于json_to_xml():它首先   将JSON数据转换为XML,然后使用ExtractValue进行应用   的XPath。

     

...

  

ExtractValue(xml_frag, xpath_expr)

     

...

     

如果找不到表达式的匹配文本节点(包括   隐式 / text()) - 无论出于何种原因,只要 xpath_expr 有效, xml_frag 由正确嵌套和关闭的元素组成 - 返回一个空字符串。没有区分空元素的匹配和根本没有匹配。这是设计的。

     

如果您需要确定是否找不到匹配的元素    xml_frag 或找到此类元素但未包含子文本   您应该测试使用XPath的表达式的结果    count()功能。

     

...

测试:

mysql> SET @`json` := '
    '> {
    '>   "key": {
    '>     "overview": "sample"
    '>   }
    '> }
    '> ';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT 
    ->   common_schema.extract_json_value(@`json`, 'key') AS result0,
    ->   common_schema.extract_json_value(@`json`, count('key')) AS result1,
    ->   common_schema.extract_json_value(@`json`, 'key/overview') AS result2,
    ->   common_schema.extract_json_value(@`json`, count('key/overview')) AS result3;
+---------+---------+---------+---------+
| result0 | result1 | result2 | result3 |
+---------+---------+---------+---------+
|         | 1       | sample  | 1       |
+---------+---------+---------+---------+
1 row in set (0.03 sec)