【问题标题】:sql query for searching within columns with json documents用于在具有 json 文档的列中搜索的 sql 查询
【发布时间】:2021-08-23 23:34:13
【问题描述】:

我使用的是 MySQL 5.7,表中的一列包含多个 JSON 文档。比如:

'[ {
  "animal" : "dog",
  "data" : {
    "body" : "This sentence does not contain any thing about grooming",
  }
},
{
  "animal" : "cat",
  "data" : {
    "body" : "No grooming needed"
  }
},
{

  "animal" : "horse",
  "data" : {
    "body" : "He is grooming his horse after the ride."
  }
}
]'

我想返回 $.data.body 多次包含 grooming 的所有行,但前提是 $.animal == horse。因此,在上面给出的示例中,它不应返回该行,因为 grooming$.data.body 部分中仅使用一次,其中 $.animal == horse

有没有在 MySql/SQL 中查询这个的好方法?我可以在 python 中做到这一点,但有兴趣知道是否有办法在 SQL/MySQL 中做到这一点。谢谢!

【问题讨论】:

    标签: mysql sql json


    【解决方案1】:

    搜索 JSON 需要复杂的查询,并且很难优化:

    SELECT ...
    FROM mytable
    CROSS JOIN JSON_TABLE(myjsoncolumn, '$[*]' COLUMNS(
      animal varchar(20) PATH '$.animal',
      body text PATH '$.data.body'
    )) AS j 
    WHERE j.animal = 'horse' AND j.body LIKE '%grooming%';
    

    JSON_TABLE() function 在 MySQL 8.0.4 中可用,但在 MySQL 的早期版本中不可用。

    底线是,如果您尝试搜索 JSON 文档的内容,那么您对 ​​SQL 的使用将变得更加困难且效率更低。

    如果您不将数据存储在 JSON 中,而是将数据存储在普通的行和列中,这会容易得多。从您展示的示例中,没有理由需要 JSON。

    【讨论】:

    • 不幸的是,我使用的是旧版本 5.7。里面有什么等价的吗?无论哪种方式,感谢您的回答。
    • MySQL 5.7 没有等效功能。您的选择是以普通方式存储数据而不是 JSON,或者升级到 MySQL 8.0,或者通过使用一些正则表达式来解决这个问题,从而缩短几年的寿命。
    猜你喜欢
    • 1970-01-01
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多