希望使用 JSON_VALUE 访问 SQL Server 表中 JSON 列中的一些数据。
我有一个包含以下列和数据的表(tblMyTable);
| Column1 | JSONColumn |
| -------- | -------------- |
| 1 | {some JSON} |
其中 {some JSON} 如下所示;
[ { "角色名":"客户", “角色”:[ { “联系人 ID”:21568, “联系人姓名”:“全名 1” }, { “联系人 ID”:31568, “联系人姓名”:“全名 2” } ] }, { "RoleName":"所有者", “角色”:[ { "联系人 ID":1, “联系人姓名”:“比利巴克斯顿” } ] } ]
我想使用这样的东西来访问比利巴克斯顿的联系人姓名;
SELECT JSON_VALUE(JSONColumn, '$[Owner].Roles[0].ContactName') AS ContactName
FROM tblMyTable
WHERE Column1=1
结果:
| ContactName |
| ----------- |
| Billy Buxton|
问题是我不知道所有者角色名称在 JSON 中的位置,所以我不能使用;'$[0].Roles[0].ContactName',因为它可能是 '$[1].Roles' 或 '$[10].Roles'。
有没有办法通过指定“所有者”或“客户”角色名来做到这一点?
此外,如果我使用以下内容,我将获得 ContactNames 数组;
SELECT JSON_QUERY(JSONColumn, '$[Client].Roles.ContactName') AS ContactNames
FROM tblMyTable
WHERE Column1=1
结果:
| ContactNames |
| ------------------ |
| FullName1,FullName2|
如果需要,我可以更改 JSON 的结构,如果可以指定路径(例如,$[Owner].Roles[0].ContactName 或类似),我会考虑使用 OpenJSON
我想出了以下选项,但它使用的是 OPENJSON,这比使用 JSON_VALUE 或 JSON_QUERY 更混乱;
SELECT Y.RoleName,STRING_AGG(Z.ContactName,',') AS ContactName
FROM (
SELECT '[{"RoleName":"Client","Roles":[{"ContactID":21568,"ContactName":"FullName1"},{"ContactID":31568,"ContactName":"FullName2"}]},{"RoleName":"Owner","Roles":[{"ContactID":1,"ContactName":"Billy Buxton"}]}]' AS Roles
)X
CROSS APPLY OPENJSON (X.Roles)
WITH (
RoleName VarChar(50),
Roles nVarChar(MAX) AS JSON
)Y
CROSS APPLY OPENJSON (Y.Roles)
WITH (
ContactID BigInt,
ContactName VarChar(255)
)Z
WHERE Y.RoleName='Client'
GROUP BY Y.RoleName
结果:
| RoleName | ContactName |
| -------- | ------------------ |
| Client | FullName1,FullName2|
提前感谢您提供的任何帮助。