我有一个名为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:
答案 0 :(得分:1)
记住:
...
此功能内部依赖于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)