代码之家  ›  专栏  ›  技术社区  ›  Ram

在sql server中解析json值

  •  1
  • Ram  · 技术社区  · 7 年前

    我想解析下面的json值。

    DECLARE @json NVARCHAR(MAX)
    SET @json =  
    N'[{"ID":1,"Roles":[1,2]},{"ID":2"Roles":[1,2,3]},{"ID":3,"Roles":[1,2,3,4]}]' 
    

    我想在输出下面显示

    Required Output
    ID ROLES
    1  1
    1  2
    2  1
    2  2
    2  3
    3  1
    3  2
    3  3
    3  4
    

    我要查询这个。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jeroen Mostert    7 年前

    OPENJSON 用一个 WITH 展开外层,然后使用常规层展开数组。(别名并不是绝对必要的,我只是认为它更清晰,如果你不得不剥去更多的层,它就变得非常必要。)

    SELECT ID, R.[Value] AS [Role]
    FROM OPENJSON(@json) WITH (
        ID INT, 
        [Roles] NVARCHAR(MAX) AS JSON
    )
    CROSS APPLY OPENJSON([Roles]) R
    
        2
  •  0
  •   gotqn user3521065    7 年前

    试试这个:

    DECLARE @json NVARCHAR(MAX)
    SET @json =  
    N'[{"ID":1,"Roles":[1,2]},{"ID":2, "Roles":[1,2,3]},{"ID":3,"Roles":[1,2,3,4]}]'
    
    
    SELECT pvt.[ID]
          ,roles.value
    FROM
    (
        SELECT js.[key] as [key_id]
              ,roles.[key]
              ,roles.value
        FROM OPENJSON(@json) js
        CROSS APPLY OPENJSON(js.value) roles 
    ) DS
    PIVOT
    (
        MAX([value]) FOR [key] IN ([ID], [Roles])
    ) PVT
    CROSS APPLY OPENJSON(pvt.roles) roles 
    

    enter image description here

    或者只是这个:

    SELECT JSON_VALUE(js.value, '$.ID')
          ,ds.[value]
    FROM OPENJSON(@json) js
    CROSS APPLY OPENJSON(JSON_QUERY(js.value, '$.Roles')) ds;