简体   繁体   English

如何从 mssql 中的 json 列获取数据

[英]How to get data from json column in mssql

I'm struggling to write a query that gets value from json column with some specific conditions.我正在努力编写一个查询,该查询从 json 列中获取一些特定条件的值。 I have a table named Table1 with a column of type nvarchar(max) named Data that contains some json values.我有一个名为 Table1 的表,其中有一列名为 Data 的 nvarchar(max) 类型的列,其中包含一些 json 值。 The json itself looks like this: json 本身如下所示:

{
"Addresses": [
    {
        "ApartmentNumber": "1",
        "City": "Rome",
        "CountryCode": "IT",
        "HouseNumber": "2",
        "Post": "Rome",
        "PostalCode": "11-111",
        "Region": "Rome",
        "Street": "Italian",
        "StreetPrefix": "St.",
        "TypeCode": "PERMANENT"
    },
    {
        "ApartmentNumber": "11",
        "City": "Madrid",
        "CountryCode": "ES",
        "HouseNumber": "22",
        "Post": "Madrid",
        "PostalCode": "11-111",
        "Region": "Madrid",
        "Street": "Spanish",
        "StreetPrefix": "St.",
        "TypeCode": "CORRESPONDENCE"
    }
],
"Contacts": [
    {
        "TypeCode": "EMAIL",
        "DefaultContact": false,
        "Value": "sample@xyz.com"
    }
],
"PersonData": {
    "BirthDate": "1968-08-03T00:00:00",
    "CitizenshipCode": "US",
    "DeathDate": "0001-01-01T00:00:00",
    "FirstName": "John",
    "Gender": "M",
    "LastName": "Jones"
}

} }

I would like to get a value of CountryCode from the Addresses node where TypeCode is "CORRESPONDENCE".我想从 TypeCode 为“CORRESPONDENCE”的 Addresses 节点获取 CountryCode 的值。 I tried to achieve that with combinations of JSON_VALUE and JSON_QUERY functions but I failed.我试图通过 JSON_VALUE 和 JSON_QUERY 函数的组合来实现这一点,但我失败了。 Below are some examples of my trials:以下是我的一些试验示例:

query:询问:

SELECT JSON_QUERY(t.Data, '$.Addresses') AS Address FROM [Table1] t

result:结果:

[
{
    "ApartmentNumber": "1",
    "City": "Rome",
    "CountryCode": "IT",
    "HouseNumber": "2",
    "Post": "Rome",
    "PostalCode": "11-111",
    "Region": "Rome",
    "Street": "Italian",
    "StreetPrefix": "St.",
    "TypeCode": "PERMANENT"
},
{
    "ApartmentNumber": "11",
    "City": "Madrid",
    "CountryCode": "ES",
    "HouseNumber": "22",
    "Post": "Madrid",
    "PostalCode": "11-111",
    "Region": "Madrid",
    "Street": "Spanish",
    "StreetPrefix": "St.",
    "TypeCode": "CORRESPONDENCE"
}

] ]

or this:或这个:

query:询问:

 select top 1 JSON_VALUE(t.Data, '$.PersonData.LastName') FROM [Table1] t where ISJSON(t.Data) > 0 and JSON_VALUE(pd.BusinessPartner, '$.PersonData.Gender') = 'F'

result: "Jones"结果:“琼斯”

but when i to write similar query with Addresses as condition:但是当我以地址为条件编写类似的查询时:

query:询问:

  select top 1 JSON_VALUE(t.Data, '$.Addresses.CountryCode') FROM [Table1] t where ISJSON(t.Data) > 0 and JSON_VALUE(t.Data,'$.Addresses.TypeCode') = 'CORRESPONDENCE'

I get empty string as the result.结果我得到空字符串。

Thanks in advance提前致谢

From SQL Server 2016, you can query on JSON column.从 SQL Server 2016,您可以查询 JSON 列。 See the documentation: Work with JSON data请参阅文档: 使用 JSON 数据

The interesting part for you it's Analyze JSON data with SQL queries .对您来说有趣的部分是使用 SQL 查询分析 JSON 数据

This done:这样做了:

select Id, PostalCode
from Address
CROSS APPLY OPENJSON (Address.Data, N'$.Addresses')
WITH (
    TypeCode varchar(50) '$.TypeCode',
    PostalCode varchar(50) '$.PostalCode'
) AS AddressesJsonData
WHERE TypeCode  = N'PERMANENT'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM