首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Server:比较json并查找新添加、更改和删除的记录

SQL Server:比较json并查找新添加、更改和删除的记录
EN

Stack Overflow用户
提问于 2021-02-20 23:58:43
回答 1查看 48关注 0票数 0

我想要比较SQL Server中的两个json,找出新增、修改和删除的值。

注:未定义输入cif_id订单。

例如,我有以下旧的和新的json:

年长的

代码语言:javascript
复制
{
 "cifs":[
    {
      "cif_id":"1",
      "bank_code":"110"
    },
    {
      "cif_id":"2",
      "bank_code":"120"
    },
    {
      "cif_id":"3",
      "bank_code":"130"
    }
  ]
}

和新的/更改的值

代码语言:javascript
复制
{
 "cifs":[
    {
      "cif_id":"1",
      "bank_code":"111"
    },
    {
      "cif_id":"2",
      "bank_code":"122"
    },
    {
      "cif_id":"4",
      "bank_code":"140"
    }
  ]
}

这里修改了cif_id 1和2,删除了3,添加了4。

我的返回值将被UI团队用来显示在页面上。我可以使用存储过程或函数,也可以使用纯SQL,我的返回应该是json格式。

结果:

代码语言:javascript
复制
{
  "added":[
     {
      "cif_id":"4",
      "bank_code":"140"
    }
  ],
  "modified":[
     {
      "cif_id":"1",
      "bank_code":"111"
    },
    {
      "cif_id":"2",
      "bank_code":"122"
    }
  ],
  "deleted":[
     {
      "cif_id":"3",
      "bank_code":"130"
    }
  ]
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-21 01:06:12

一种可能的方法:

代码语言:javascript
复制
DECLARE @old nvarchar(max) = N'{
 "cifs": [
    {"cif_id":"1", "bank_code":"110"},
    {"cif_id":"2", "bank_code":"120"},
    {"cif_id":"3", "bank_code":"130"}
  ]
}'
DECLARE @new nvarchar(max) = N'{
 "cifs": [
    {"cif_id":"1", "bank_code":"111"},
    {"cif_id":"2", "bank_code":"122"},
    {"cif_id":"4", "bank_code":"140"}
  ]
}'

; WITH OldCTE AS (
   SELECT *
   FROM OPENJSON(@old, '$.cifs') WITH (
      cif_id nvarchar(1) '$.cif_id',
      bank_code nvarchar(3) '$.bank_code'
   )
), NewCTE AS (
   SELECT *
   FROM OPENJSON(@new, '$.cifs') WITH (
      cif_id nvarchar(1) '$.cif_id',
      bank_code nvarchar(3) '$.bank_code'
   )
)
SELECT
   added = (
      SELECT cif_id, bank_code
      FROM NewCTE 
      WHERE cif_id NOT IN (SELECT cif_id FROM OldCTE)
      FOR JSON AUTO
   ),
   modified = (
      SELECT n.cif_id, n.bank_code 
      FROM NewCTE n
      INNER JOIN OldCTE o ON n.cif_id = o.cif_id AND n.bank_code <> o.bank_code
      FOR JSON AUTO
   ),
   deleted = (
      SELECT cif_id, bank_code
      FROM OldCTE 
      WHERE cif_id NOT IN (SELECT cif_id FROM NewCTE)
      FOR JSON AUTO
   )
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

结果:

代码语言:javascript
复制
{
   "added":[
      {
         "cif_id":"4",
         "bank_code":"140"
      }
   ],
   "modified":[
      {
         "cif_id":"1",
         "bank_code":"111"
      },
      {
         "cif_id":"2",
         "bank_code":"122"
      }
   ],
   "deleted":[
      {
         "cif_id":"3",
         "bank_code":"130"
      }
   ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66293615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档