【问题标题】:Generate a JSON string containing the differences in two other JSON strings using T-SQL使用 T-SQL 生成包含其他两个 JSON 字符串差异的 JSON 字符串
【发布时间】:2023-03-20 06:11:01
【问题描述】:

假设我有两个 JSON 字符串如下:

[{"RowId":102787,"UserId":1,"Activity":"This is another test","Timestamp":"2017-11-25T14:37:30.3700000"}]

[{"RowId":102787,"UserId":2,"Activity":"Testing the Update function","Timestamp":"2017-11-25T14:37:30.3700000"}]

两者具有相同的属性,但第二个字符串中的两个属性的值与第一个不同(UserId 和 Activity)。是否可以在 Azure SQL 数据库 T-SQL 中生成第三个 JSON 字符串,其中包含第二个字符串中与第一个不同的值?换句话说,我希望返回一个如下所示的字符串:

[{"UserId":2,"Activity":"Testing the Update function"}]

此外,解决方案应假定 JSON 字符串中的属性未知。我需要它成为任何两个 JSON 字符串的通用解决方案。

【问题讨论】:

    标签: json sql-server tsql azure-sql-database


    【解决方案1】:

    尚未在 Azure 上尝试过,但似乎可以在 SQL Server 2017 上运行 除了通过字符串操作之外,可能还有一种更优雅的方法可以得到最终的 JSON 字符串,也许我们可以在找到更好的方法时更新答案。

    -- Expected : [{"UserId":2,"Activity":"Testing the Update function"}]
    DECLARE  @jsonA     NVARCHAR(MAX) = '[{"RowId":102787,"UserId":1,"Activity":"This is another test","Timestamp":"2017-11-25T14:37:30.3700000"}]'
            ,@jsonB     NVARCHAR(MAX) = '[{"RowId":102787,"UserId":2,"Activity":"Testing the Update function","Timestamp":"2017-11-25T14:37:30.3700000"}]'
            ,@result    NVARCHAR(MAX) = ''
    
    SELECT   @jsonA = REPLACE(REPLACE(@jsonA, ']', ''), '[', '')
            ,@jsonB = REPLACE(REPLACE(@jsonB, ']', ''), '[', '')
    
    ;WITH DSA AS
    (
        SELECT *
        FROM OPENJSON(@jsonA)   
    )
    ,DSB AS
    (
        SELECT *
        FROM OPENJSON(@jsonB)   
    )
    SELECT @result  += CONCAT   (
                                     '"', B.[key], '":'
                                    ,IIF(B.[type] = 2, B.[value], CONCAT('"', B.[value], '"'))  -- havent checked types other than 1 and 2; think there's a bool type?
                                    ,','
                                )
    
    FROM DSA    A
    JOIN DSB    B ON A.[key] = B.[key]
    WHERE A.[value] != B.[value]
    
    SELECT CONCAT('[{', LEFT(@result, LEN(@result) - 1), '}]')
    

    【讨论】:

    • 谢谢。非常好的作品,这在 Azure 下工作。我不太了解 JSON 的细微差别。你的评论是什么意思,“没有检查过 1 和 2 以外的类型;认为有 bool 类型?”
    • @RandyMinder; JSON 中数字或字符串的类型决定了该值是否用引号括起来。我认为 JSON,因为它在 javascript 中的根源,可能有第三种类型:布尔值。只是说我没有为字符串和数字以外的任何可能性编码。希望能解决问题:)
    • 知道了。周末我做了一些研究,对你的代码做了一些调整,让它按照我需要的方式工作。感谢您的帮助。
    • @RandyMinder - 很高兴听到!如果您所做的任何改进可能会使他人受益,请随时分享。
    • @MarkD [{"RowId":102787,"UserId":1,"Activity":"这是另一个测试","Timestamp":"2017-11-25T14:37:30.3700000" ,"a":[{"b":"sssss"},{"b":"dfdfdf"}]}] 如何使用这个 SP 比较这个字符串
    猜你喜欢
    • 2019-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多