按兄弟 属性 的值过滤 JSON 数据

Filter JSON data by a sibling property's value

示例数据设置:

DECLARE @Data TABLE (Id INT IDENTITY(1,1), JSONData NVARCHAR(MAX))
INSERT INTO @Data
VALUES ( N'
{
    "propId": 0,
    "propName": "Helo.World",
    "dataDump": [   {
                        "propId": 0,
                        "propName": "fName",
                        "val": "John"
                    },
                    {
                        "propId": 0,
                        "propName": "lName",
                        "val": "Doe",
                        "dataDump": [   {
                                            "propId": 0,
                                            "propName": "homePhone",
                                            "val": "1010101010"
                                        },
                                        {
                                            "propId": 0,
                                            "propName": "mobilePhone",
                                            "val": "010101010101"
                                        }
                                    ]
                    },
                    {
                        "propId": 0,
                        "propName": "isAuthorized",
                        "val": "true"
                    },
                    {
                        "propId": 0,
                        "propName": "isFullAccess",
                        "val": "false"
                    }
                ]
}' ),
( N'
{
    "propId": 0,
    "propName": "Helo.World",
    "dataDump": [   {
                        "propId": 0,
                        "propName": "fName",
                        "val": "Joe"
                    },
                    {
                        "propId": 0,
                        "propName": "lName",
                        "val": "Harris",
                        "dataDump": [   {
                                            "propId": 0,
                                            "propName": "homePhone",
                                            "val": "2020202020"
                                        }
                                    ]
                    },
                    {
                        "propId": 0,
                        "propName": "isAuthorized",
                        "val": "true"
                    },
                    {
                        "propId": 0,
                        "propName": "isFullAccess",
                        "val": "true"
                    }
                ]
}' ), (N'
{
    "propId": 0,
    "propName": "Helo.World",
    "dataDump": [   {
                        "propId": 0,
                        "propName": "fName",
                        "val": "Olivia"
                    },
                    {
                        "propId": 0,
                        "propName": "lName",
                        "val": "Smith"
                    },
                    {
                        "propId": 0,
                        "propName": "isAuthorized",
                        "val": "false"
                    },
                    {
                        "propId": 0,
                        "propName": "isFullAccess",
                        "val": "false"
                    }
                ]
}' ),( N'
{
    "propId": 0,
    "propName": "Helo.World",
    "dataDump": [   {
                        "propId": 0,
                        "propName": "fName",
                        "val": "George"
                    },
                    {
                        "propId": 0,
                        "propName": "lName",
                        "val": "Hart",
                        "dataDump": [   {
                                            "propId": 0,
                                            "propName": "homePhone",
                                            "val": "3030303030"
                                        },
                                        {
                                            "propId": 0,
                                            "propName": "mobilePhone",
                                            "val": "030303030303"
                                        }
                                    ]
                    },
                    {
                        "propId": 0,
                        "propName": "isFullAccess",
                        "val": "false"
                    }
                ]
}' ) ;

SELECT [Id]
     , [JSONData]
FROM @Data
-- WHERE [JSONData].dataDump.propName = 'isAuthorized'
--       AND [JSONData].dataDump.val = 'true'

目标:

到具有“[JSONData].dataDump.propName”= 'isAuthorized' 和“[[=] 的记录的 return Id 和 JSON 39=]数据].dataDump.val" = 'true'

预期输出:

第 1 条和第 2 条记录应该 returned,因为尽管第 3 条记录有“[JSONData].dataDump.propName”= 'isAuthorized',但它没有有它的“[JSONData].dataDump.val”= 'true'(它是 'false')而第 4 条记录甚至没有这个 属性.

我完全不熟悉在 SQL 服务器中解析 JSON,没有找到按同级值过滤的类似示例。

我的(未成功)尝试:

SELECT  *
FROM    @Data AS [T]
CROSS APPLY
        OPENJSON ( [T].[JSONData], '$.dataDump' )
            WITH
                ( [propName] NVARCHAR ( 100 )
                , [val] NVARCHAR ( MAX ) AS JSON ) AS [dat]
WHERE   [dat].[propName] = 'isAuthorized'
        AND [dat].[val] = 'true' ;

这似乎 return 没有任何数据。

非常接近,但是 val 只是一个类似于 propName 的字符串。所以

SELECT *
FROM @Data
cross apply openjson(JSONData,'$.dataDump') 
with 
(
  propName nvarchar(200),
  val      nvarchar(200)
)
where propName = 'isAuthorized'
  and val = 'true'