2

希望使用 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|

提前感谢您提供的任何帮助。

4

1 回答 1

0

检查这是否能解决您的需求

---------------- DDL+DML
use tempdb
GO

CREATE TABLE tblMyTable (ID INT, JSONColumn NVARCHAR(MAX))
GO

INSERT tblMyTable (ID, JSONColumn)
VALUES (1, '    [
       {
          "RoleName":"Client",
          "Roles":[
             {
                "ContactID":21568,
                "ContactName":"FullName1"
             },
             {
                "ContactID":31568,
                "ContactName":"FullName2"
             }
          ]
       },
       {
          "RoleName":"Owner",
          "Roles":[
             {
                "ContactID":1,
                "ContactName":"Billy Buxton"
             }
          ]
       }
    ]')
GO

---------- Solution
select ID, RoleName, Roles, Soluion = JSON_VALUE(Roles, '$[0].ContactName')
from tblMyTable t
CROSS APPLY OpenJson(t.JSONColumn)
WITH (
        RoleName VarChar(50),
        Roles nVarChar(MAX) AS JSON
        )Y
WHERE RoleName = 'Owner'
GO

笔记!我假设所有者只有一个角色,这就是我可以使用的原因$[0]

于 2021-09-23T03:25:13.770 回答