【问题标题】:Querying JSON Array in SQL在 SQL 中查询 JSON 数组
【发布时间】:2021-11-01 00:03:12
【问题描述】:

我正在尝试在 SQL Server 中查询嵌套在数组中的 JSON 文件。下面是 JSON 的 sn-p:

[
    {
        "data_json": [
            {
                "site": "Test Western Cape DC",
                "year": 2021,
                "month": "2019-01-01 - 2019-01-31",
                "total_kWh": {
                    "grid_electricity": 845106.2790000001,
                    "pv_electricity": 234122.22499999998
                }
            }
        ]
    },
    {
        "data_json": [
            {
                "site": "Test Western Cape DC",
                "year": 2021,
                "month": "2019-02-01 - 2019-02-28",
                "total_kWh": {
                    "grid_electricity": 796965.3940000001,
                    "pv_electricity": 169540.028
                }
            }
        ]
    }
]   

我想获得两行的最终结果,其中包含 SiteMonthGrid ElectricityPV Electricity 的列

如果我删除方括号,我能够获得所需的列输出,但我想保留文件原样,我的结果也只包括第一行:

DECLARE @WP_ACCOUNT VARCHAR(MAX)

SELECT @WP_ACCOUNT =
    BulkColumn
    FROM OPENROWSET(BULK'C:\Users\taariq\Desktop\JSON\19-276.json', SINGLE_BLOB) JSON

    SELECT j2.SITEDESC, j2.MONTHID, h1.ELECGRID, h1.ELECPV
    FROM OPENJSON(@WP_ACCOUNT, '$.data_json') j1
    OUTER APPLY OPENJSON(j1.[value]) WITH (
        SITEDESC nvarchar(50) '$.site',
        MONTHID nvarchar(50) '$.month',
        total_kWh nvarchar(max) '$.total_kWh' AS JSON
    ) j2
    CROSS APPLY OPENJSON(j2.total_kWh) WITH (
        ELECGRID nvarchar(50) '$.grid_electricity',
        ELECPV nvarchar(50) '$.pv_electricity'
    ) h1

【问题讨论】:

    标签: sql arrays json sql-server


    【解决方案1】:

    离你不远了。一种方法如下。我在最后两列使用JSON_VALUE 来演示它的用途,但如果您愿意,可以在CROSS APPLY 中使用另一个调用OPENJSON

    DECLARE @JSON nvarchar(MAX) = N'[
        {
            "data_json": [
                {
                    "site": "Test Western Cape DC",
                    "year": 2021,
                    "month": "2019-01-01 - 2019-01-31",
                    "total_kWh": {
                        "grid_electricity": 845106.2790000001,
                        "pv_electricity": 234122.22499999998
                    }
                }
            ]
        },
        {
            "data_json": [
                {
                    "site": "Test Western Cape DC",
                    "year": 2021,
                    "month": "2019-02-01 - 2019-02-28",
                    "total_kWh": {
                        "grid_electricity": 796965.3940000001,
                        "pv_electricity": 169540.028
                    }
                }
            ]
        }
    ]'
    
    SELECT dj.site,
           dj.year,
           dj.month,
           JSON_VALUE(dj.total_kWh,'$.grid_electricity') AS ELECGRID,
           JSON_VALUE(dj.total_kWh,'$.pv_electricity') AS ELECPV
    FROM OPENJSON(@JSON)
         WITH (data_json nvarchar(MAX) AS JSON) J
         CROSS APPLY OPENJSON(J.data_json)
                     WITH(site nvarchar(50),
                          year int,
                          month nvarchar(50),
                          total_kWh nvarchar(MAX) AS JSON) dj;
    

    【讨论】:

    • 或者,您可以在第二个 OPENJSON 中指定 JSON 路径(不需要第三个)grid_electricity decimal '$.total_kWh.grid_electricity', pv_electricity decimal '$.total_kWh.pv_electricity') dj
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多