使用 JSON_VALUE 访问 SQL Server 2016 中的 JSON 数组
Accessing JSON Array in SQL Server 2016 using JSON_VALUE
我在使用新引入的 JSON_VALUE 函数访问 json 中的数组时卡住了。请考虑以下代码 -
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='JsonData')
DROP TABLE JsonData;
go
CREATE TABLE JsonData(JsonData nvarchar(max));
DECLARE @SQL nvarchar(max);
DECLARE @Table AS TABLE(JsonPath VARCHAR(256));
INSERT INTO JsonData(JsonData)
VALUES(
'{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}')
INSERT INTO @Table
SELECT VALUE FROM OPENJSON('{
"Path1":"$.firstName","Path2":"$.phoneNumbers[:1].number"
}') ;
SELECT @SQL=(SELECT 'UNION SELECT '''+ CAST(JsonPath AS VARCHAR(256)) +''',JSON_VALUE(JsonData,'''+a.JsonPath+''')
FROM JsonData a'
FROM @Table a
FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)')
FROM @Table t;
SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)
PRINT @SQL
EXEC SP_EXECUTESQL @SQL;
此处如果我想访问特定的 phone 号码,那么访问此节点的常用语法将不起作用。在这种情况下我收到以下错误
JSON path is not properly formatted. Unexpected character ':' is found at position 15.
虽然我在 http://jsonpath.com 检查时,我能够检索值。 SQL 服务器 2016 是否使用一些不同的语法来访问 JSON 值?
SQL Server 2016 支持 JSON。它非常相似,几乎相同。您将进行自己的比较。
您不需要使用临时变量@Table 然后进行操作...
只需运行以下查询
SELECT JSON_VALUE( JsonData, '$.phoneNumbers[0].type' ) AS [PhoneType],
JSON_VALUE( JsonData, '$.phoneNumbers[0].number' ) AS [PhoneNumber]
FROM JsonData
WHERE ISJSON( JsonData ) > 0;
--iPhone 0123-4567-8888
SELECT JSON_VALUE( JsonData, '$.phoneNumbers[1].type' ) AS [PhoneType],
JSON_VALUE( JsonData, '$.phoneNumbers[1].number' ) AS [PhoneNumber]
FROM JsonData
WHERE ISJSON( JsonData ) > 0;
--home 0123-4567-8910
查看来自 Microsoft 的这些官方链接,了解有关 JSON 支持的更多详细信息:
要从 phoneNumbers 获取全部:
DECLARE @json nvarchar(max)=
'{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}'
SELECT [Type], [Number]
FROM OPENJSON( @json, '$.phoneNumbers' )
WITH ([Type] NVARCHAR(25) '$.type', [Number] NVARCHAR(25) '$.number');
您可以使用 "CROSS APPLY" 获取名字为 phone 的号码:
SELECT JSON_VALUE (jsonData, '$.firstName'),p.*
FROM JsonData
CROSS APPLY
OPENJSON (JsonData, '$.phoneNumbers') WITH(type varchar(10) '$.type', number varchar (30) '$.number') p
一起。
DECLARE @json NVARCHAR(MAX)
= '{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}';
SELECT
Core.*
,ARRAY.[Type]
,ARRAY.[Number]
FROM
OPENJSON(@json)
WITH
(
FirstName NVARCHAR(25) '$.firstName'
,LastName NVARCHAR(25) '$.lastName'
,Age INT '$.age'
,streetAddress NVARCHAR(25) '$.address.streetAddress'
,city NVARCHAR(25) '$.address.city'
) AS Core
CROSS APPLY
OPENJSON(@json, '$.phoneNumbers')
WITH
(
[Type] NVARCHAR(25) '$.type'
,[Number] NVARCHAR(25) '$.number'
) AS ARRAY;
我在使用新引入的 JSON_VALUE 函数访问 json 中的数组时卡住了。请考虑以下代码 -
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='JsonData')
DROP TABLE JsonData;
go
CREATE TABLE JsonData(JsonData nvarchar(max));
DECLARE @SQL nvarchar(max);
DECLARE @Table AS TABLE(JsonPath VARCHAR(256));
INSERT INTO JsonData(JsonData)
VALUES(
'{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}')
INSERT INTO @Table
SELECT VALUE FROM OPENJSON('{
"Path1":"$.firstName","Path2":"$.phoneNumbers[:1].number"
}') ;
SELECT @SQL=(SELECT 'UNION SELECT '''+ CAST(JsonPath AS VARCHAR(256)) +''',JSON_VALUE(JsonData,'''+a.JsonPath+''')
FROM JsonData a'
FROM @Table a
FOR XML PATH(''), TYPE)
.value('.','NVARCHAR(MAX)')
FROM @Table t;
SELECT @SQL=RIGHT(@SQL,LEN(@SQL)-5)
PRINT @SQL
EXEC SP_EXECUTESQL @SQL;
此处如果我想访问特定的 phone 号码,那么访问此节点的常用语法将不起作用。在这种情况下我收到以下错误
JSON path is not properly formatted. Unexpected character ':' is found at position 15.
虽然我在 http://jsonpath.com 检查时,我能够检索值。 SQL 服务器 2016 是否使用一些不同的语法来访问 JSON 值?
SQL Server 2016 支持 JSON。它非常相似,几乎相同。您将进行自己的比较。
您不需要使用临时变量@Table 然后进行操作...
只需运行以下查询
SELECT JSON_VALUE( JsonData, '$.phoneNumbers[0].type' ) AS [PhoneType],
JSON_VALUE( JsonData, '$.phoneNumbers[0].number' ) AS [PhoneNumber]
FROM JsonData
WHERE ISJSON( JsonData ) > 0;
--iPhone 0123-4567-8888
SELECT JSON_VALUE( JsonData, '$.phoneNumbers[1].type' ) AS [PhoneType],
JSON_VALUE( JsonData, '$.phoneNumbers[1].number' ) AS [PhoneNumber]
FROM JsonData
WHERE ISJSON( JsonData ) > 0;
--home 0123-4567-8910
查看来自 Microsoft 的这些官方链接,了解有关 JSON 支持的更多详细信息:
要从 phoneNumbers 获取全部:
DECLARE @json nvarchar(max)=
'{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}'
SELECT [Type], [Number]
FROM OPENJSON( @json, '$.phoneNumbers' )
WITH ([Type] NVARCHAR(25) '$.type', [Number] NVARCHAR(25) '$.number');
您可以使用 "CROSS APPLY" 获取名字为 phone 的号码:
SELECT JSON_VALUE (jsonData, '$.firstName'),p.*
FROM JsonData
CROSS APPLY
OPENJSON (JsonData, '$.phoneNumbers') WITH(type varchar(10) '$.type', number varchar (30) '$.number') p
一起。
DECLARE @json NVARCHAR(MAX)
= '{
"firstName": "John",
"lastName" : "doe",
"age" : 26,
"address" : {
"streetAddress": "naist street",
"city" : "Nara",
"postalCode" : "630-0192"
},
"phoneNumbers": [
{
"type" : "iPhone",
"number": "0123-4567-8888"
},
{
"type" : "home",
"number": "0123-4567-8910"
}
]
}';
SELECT
Core.*
,ARRAY.[Type]
,ARRAY.[Number]
FROM
OPENJSON(@json)
WITH
(
FirstName NVARCHAR(25) '$.firstName'
,LastName NVARCHAR(25) '$.lastName'
,Age INT '$.age'
,streetAddress NVARCHAR(25) '$.address.streetAddress'
,city NVARCHAR(25) '$.address.city'
) AS Core
CROSS APPLY
OPENJSON(@json, '$.phoneNumbers')
WITH
(
[Type] NVARCHAR(25) '$.type'
,[Number] NVARCHAR(25) '$.number'
) AS ARRAY;