首页 > 解决方案 > 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

有可能吗?

标签: mysqlsql

解决方案


您可以使用 MySQLJSON_CONTAINS函数(5.7 及更高版本)比较两者,但它只会返回是否response包含结构,evaluation反之亦然。这意味着您必须同时执行这JSON_CONTAINS两种方法来查看它们是否 100% 相等。

关于差异:内置函数无法做到这一点。可以使用遍历两个对象并确定元素是否存在、不同或缺失并以差异格式输出的存储过程。在 Stackoverflow 上进行了一次类似的尝试: https ://codereview.stackexchange.com/questions/213951/mysql-json-diff-procedure


推荐阅读