[英]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.