mysql - SQL 查询:JSON 列差异
问题描述
我需要你的想法来解决奇怪的问题。
表结构:id (increment), meta (JSON).
元看起来像:
{
"response": [
{
"name": "x",
"file_id": 957353,
"user_id": 11111,
"lastname": "x",
"born_date": "1915-10-29",
"file_path": "xxxx/xx/xx/xxxxxxxxx",
"valid_date": "2099-01-01",
"document_id": 33333,
"document_type": "xxx_x_x_x",
}
],
"evaluation": [
{
"name": "a",
"file_id": 957353,
"user_id": 11111,
"lastname": "b",
"born_date": "1915-10-29",
"file_path": "xxxx/xx/xx/xxxxxxxxx",
"valid_date": "2099-01-01",
"document_id": 33333,
"document_type": "xxx_x_x_x",
}
]
}
我必须将响应与评估进行比较。我需要类似 diff 或数据是否相同的信息。它必须是 SQL 查询。
我正在寻找这样的结果:
id | identical | diff ?
1 | 1 | null
2 | 0 | 'xxxx => xxx'
3 | 1 | null
有可能吗?
解决方案
您可以使用 MySQLJSON_CONTAINS
函数(5.7 及更高版本)比较两者,但它只会返回是否response
包含结构,evaluation
反之亦然。这意味着您必须同时执行这JSON_CONTAINS
两种方法来查看它们是否 100% 相等。
关于差异:内置函数无法做到这一点。可以使用遍历两个对象并确定元素是否存在、不同或缺失并以差异格式输出的存储过程。在 Stackoverflow 上进行了一次类似的尝试: https ://codereview.stackexchange.com/questions/213951/mysql-json-diff-procedure
推荐阅读
- python - 错误:谷歌云 AutoML 无法导入库
- neo4j - 如何将嵌套列表插入具有直接关系的 neo4j(密码查询语言)
- visual-studio-code - 为 VS Code 添加 Intellisense 和自动完成功能
- ios - 如何删除 inputAccessoryView 并将其替换为另一个视图?
- android - 在 Android 的 Firestore 中的集合中计数数组
- asp.net-core - Microsoft.AspNetCore.Authentication.OpenIdConnect 引发“无法将令牌响应正文解析为 JSON”错误
- rest - POST 到 Asp.Net Web Api 中的多个表
- node.js - 如何在 Nextjs 中添加 sitemap.xml
- javascript - 如何突出显示段落中大于或等于 8 个字符的单词?JavaScript
- javascript - 如何创建子元素并将其移动到父元素中?