从mysql查询中提取json值

Posted

技术标签:

【中文标题】从mysql查询中提取json值【英文标题】:Extracting json value from mysql query 【发布时间】:2021-03-08 06:20:36 【问题描述】:

我在 mysql 中有 json 类型的数据,列名是“student_data”。学生数据:

"STUDENT_HISTORY": ["regno": "12345678","UPDATE_DATE_UNIX_TIME": "65667","regno": "12345332","UPDATE_DATE_UNIX_TIME": "654333"]

我需要根据 regno = "12345678" 的条件提取 student_data,这里我只有 regno 值不知道 json 中的索引,我也尝试了下面给出的 json_extract 查询。

SELECT JSON_EXTRACT(student_data,"$.STUDENT_HISTORY.regno") 
  FROM student table 
 WHERE STUDENT_HISTORY.regno = "12345678"

【问题讨论】:

格式化您的问题 - 现在无法阅读。以 CREATE TABLE + INSERT INTO 脚本的形式提供示例数据。以文本表格格式显示所需的输出。指定精确的 MySQL 版本。 【参考方案1】:

如果你运行的是 MySQL 8.0,你可以使用json_table():

select s.*, x.*
from student s
cross join json_table(
    s.student_date,
    '$.STUDENT_HISTORY' columns (
        regno varchar(50),
        UPDATE_DATE_UNIX_TIME varchar(50)
    )
) x
where x.regno = '12345678'

【讨论】:

Getting syntax error 'ERROR 1064 (42000): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 ',UPDATE_DATE_UNIX_TIME varchar(50))) x where x.regno ='12345678' at line 1 '附近使用正确的语法 '【参考方案2】:

您仍然可以使用JSON_EXTRACT() 进行一些小的更改,例如

SELECT *
  FROM student 
 WHERE JSON_UNQUOTE(JSON_EXTRACT(`student_data`,'$.STUDENT_HISTORY[0].regno'))='12345678'

Demo

【讨论】:

我们需要一个不基于索引的查询。它应该被概括。 regno = '12345678' 只有我们知道这个值。我们不知道 json 中的索引。 @NeelaKandan 好吧,你应该明确解释问题中的逻辑 是的,很可能如果在我的问题中添加了另一个 json,理解会更好让我编辑它。

以上是关于从mysql查询中提取json值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 MySQL 中的数字键嵌套 JSON 字段中提取值

MySQL 查询从表中检索数据和第二个查询以提取其他结果,没有重复

mysql json 方法

MySQL 查询返回 JSON 数据需要很长时间

MySQL 学习笔记 JSON 类型

MySQL 学习笔记 JSON 类型