【问题标题】:Access JSON_VALUE from SQL Column containing JSON String with Arrays从包含带有数组的 JSON 字符串的 SQL 列访问 JSON_VALUE
【发布时间】:2023-03-26 05:21:01
【问题描述】:

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

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

【问题讨论】:

  • OPENJSON 钻研现在差不多了。不幸的是,JSON 查询相当有限。希望它们在 SQL Server 的未来版本中得到增强...

标签: tsql json-query open-json json-value


【解决方案1】:

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

---------------- 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]

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多