【问题标题】:Mysql Json Extract - wild card selection of keyMysql Json Extract - 密钥的通配符选择
【发布时间】: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


【解决方案1】:

$.RootData."202003"**.abc 形式的路径应该会有所帮助。

参考 - https://www.db-fiddle.com/f/6g4qiekAU4i3J8iRoAZiCA/0

结果类型将是数组。要获取第一个匹配结果,可以将结果嵌套在另一个 JSON_EXTRACT 中,如下所示

select JSON_EXTRACT(JSON_EXTRACT(convert(data using utf8), '$.RootData."202003"**.abc'), '$[0]')
from rootdata;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 2020-03-02
    • 2023-04-03
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多