【发布时间】:2020-12-24 04:49:52
【问题描述】:
下面是我数据库中的 json blob
{
RootData: {
202003: {
201903: {
"abc": 123,
xyz: 456
},
data1: {
},
data2: {
}
}
}
}
现在我有一个查询在哪里提取节点 201903 内的数据,如下所示
select blah blah,
JSON_EXTRACT(convert(columnname using utf8), '$.RootData."202003"."201903".abc') as blah
在上面的查询中,我的问题围绕着'$.RootData."202003"."201903".abc'这个部分展开
我不想对 201903 部分进行硬编码,并不想在通配符的帮助下寻找可以选择节点的语法。
我尝试了以下选项,但没有成功
'$.RootData."202003"."20*".abc'
'$.RootData."202003".[1].abc'
'$.RootData."202003".$.20*.abc'
不起作用,因为我猜它的语法不正确。寻找正确的语法。 20 总是那个键的开始,我们可以依赖它。 它始终是第一把钥匙。
【问题讨论】:
-
您必须:使用 JSON_KEYS 并获取所有现有密钥;根据您的条件/模式测试密钥并过滤不匹配的密钥;使用匹配的键,根据路径构建(使用常见的字符串函数)并根据值检索。
-
您可以使用
'$.RootData."202003"**.abc'的路径。结果将采用数组的形式。参考 - db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/0 -
如果您需要将结果作为单个值,可以将结果的另一个提取作为 -db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/1
-
@Prasanna 非常感谢您的调查。这样可行。但是,当我说 $[0] 时,我将整个 json 接收回结果集。
-
@SureshAtta,奇怪。准确地说,有 2 个 JSON_EXTRACT。内层使用**,外层使用'$[0]'。你能在db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/1 中复制这个问题吗?
标签: mysql sql json json-extract