从 JSON 格式的 SQL 列中提取值

时间:2021-05-03 07:42:18

标签: json sql-server sql-view cross-apply open-json

我需要从具有 JSON 格式的列中提取值。 这是该列的表中行之一的示例,这里有两个 operatorKeys,但在其他行中可能有更多:

{
"officeId": "office8685",
"TypeOfOffice": null,
"Telefonnummer": "",
"Operatorer": [
    {
        "OperatorKey": "1",
        "OperatorUserID": {
            "Agency": "Other",
            "AgencySpecified": true,
            "Value": "TM-Oper-1"
        },
        "ContactInformation": {
            "FirstName": "mike",
            "LastName": null,
            "Address": {
                "Street": null,
                "City": null,
                "Province": null,
                "Country": null
            },
            "Phone": null,
            "Fax": null,
            "Email": null, 
        }
    },
    {
        "OperatorKey": "4",
        "OperatorUserID": {
            "Agency": "Other",
            "AgencySpecified": true,
            "Value": "TM-Oper-4"
        },
        "ContactInformation": {
            "FirstName": "xxx",
            "LastName": null,
            "Address": {
                "Street": null,
                "City": null,
                "Province": null,
                "Country": null
            },
            "Phone": null,
            "Fax": null,
            "Email": null,
        }
    }       
]

}

这是我尝试读取 JSON 的 SQL 视图,我使用 openjsoncross apply 读取值:

Alter view  dbo.vOffice as 
select
      column1,column2
      --,column3 --this column contains values with json format
      ,OfficId,TypeOfOffice,Telefonnummer,Operatorer,OperatorKey,OperatorUserID                          
      ,ContactInformation,Agency,AgencySpecified,[Value],FirstName,LastName                              
      ,[Address],Phone, Fax, Email 
FROM [produktion_dim].[VirkesverdeStandardSCD1]
CROSS APPLY OPENJSON (column3,'$.OfficId') with (
OfficId varchar(4096)   '$.OfficId',TypeOfOffice varchar(4096)  '$.TypeOfOffice',
Telefonnummer varchar(4096) '$.Telefonnummer',Operatorer varchar(4096)  '$.Operatorer')
cross apply openjson(Operatorer, '$')  with(OperatorKey  varchar(4096)  '$.OperatorKey', OperatorUserID varchar(4096) '$.OperatorUserID', ContactInformation     varchar(4096)  '$.ContactInformation')
cross apply openjson(OperatorUserID,'$') with ( Agency varchar(4096) '$.Agency',
AgencySpecified varchar(4096) '$.AgencySpecified',[Value]                           varchar(4096)   '$.Value'   )
cross apply openjson( ContactInformation, '$') with (FirstName                              varchar(4096)   '$.FirstName',LastName varchar(4096)    '$.LastName',[Address] varchar(4096)    '$.Address',Phone   varchar(4096)   '$.Phone',Fax       varchar(4096)   '$.Fax',Email   varchar(4096)   '$.Email')
cross apply openjson([Address],'$') with ( Street varchar(4096) '$.Street',
City varchar(4096)  '$.City',Province varchar(4096) '$.Province',Country    varchar(4096) '$.Country')

但是我遇到了错误。您能告诉我 SQL 视图中缺少什么或应该更改什么吗?

1 个答案:

答案 0 :(得分:0)

一旦您可以组织发送者以发送正确格式的 JSON 数据,这里有一些技巧可以帮助您解析 JSON 数据:

  • '$' 中的 openjson(something, '$') with (...) 是多余的,只需使用 openjson(something) with (...)
  • JSON 路径查询区分大小写:$.officeId$. OfficeId 不同,两者都不匹配 '$.OfficId'
  • with (...) 中声明一个列要被另一个 openjson() 调用使用时,它需要使用类型 nvarchar(max) 并在其定义中包含 as json,例如:{{ 1}}。

我已编辑您的查询以提取我认为您正在寻找的 JSON 数据...

OperatorUserID nvarchar(max) '$.OperatorUserID' as json
相关问题