Json 查询 table?
Json query to a table?
我有一个 JSON 字符串,如下所示。如何使用带有过程或函数的 SQL 服务器在下面创建 table 或类似的?谢谢大家
我正在使用 SQL 服务器 15.0.2080.9。
{
"Person": {
"firstName": "John",
"lastName": "Smith",
"age": 25,
"Address": {
"streetAddress":"21 2nd Street",
"city":"New York",
"state":"NY",
"postalCode":"10021"
},
"PhoneNumbers": {
"home":"212 555-1234",
"fax":"646 555-4567"
}
}
}
您可以使用Openjson,它会给您想要的结果。
这是您的特定示例 JSON:
DECLARE @Json NVARCHAR(max) = '{
"Person": {
"firstName": "John",
"lastName": "Smith",
"age": 25,
"Address": {
"streetAddress":"21 2nd Street",
"city":"New York",
"state":"NY",
"postalCode":"10021"
},
"PhoneNumbers": {
"home":"212 555-1234",
"fax":"646 555-4567"
}
}
}'
SELECT NULL AS Parent
,[KEY]
,[value]
FROM openjson(@json, '$')
UNION ALL
SELECT 'Person' AS Parent,
[KEY]
,[value]
FROM openjson(@json, '$.Person')
UNION ALL
SELECT 'Address'AS Parent,
[KEY]
,[value]
FROM openjson(@json, '$.Person.Address')
UNION ALL
SELECT 'PhoneNumbers' AS Parent ,[KEY]
,[value]
FROM openjson(@json, '$.Person.PhoneNumbers')
这是一个很好的起点 ,但它是一种简化的方法(如果解析的 JSON 具有包含嵌套 JSON 对象的变量结构,但没有 JSON arrays) 是以下递归语句:
JSON:
DECLARE @json nvarchar(max) = N'
{
"Person": {
"firstName": "John",
"lastName": "Smith",
"age": 25,
"Address": {
"streetAddress":"21 2nd Street",
"city":"New York",
"state":"NY",
"postalCode":"10021"
},
"PhoneNumbers": {
"home":"212 555-1234",
"fax":"646 555-4567"
}
}
}'
声明:
;WITH rCTE AS (
SELECT
1 AS Id,
CONVERT(nvarchar(max), NULL) COLLATE DATABASE_DEFAULT AS [Parent],
CONVERT(nvarchar(max), N'Person') COLLATE DATABASE_DEFAULT AS [Key],
CONVERT(nvarchar(max), JSON_QUERY(@json, '$.Person')) COLLATE DATABASE_DEFAULT AS [Value]
UNION ALL
SELECT
r.Id + 1,
CONVERT(nvarchar(max), r.[Key]) COLLATE DATABASE_DEFAULT,
CONVERT(nvarchar(max), c.[Key]) COLLATE DATABASE_DEFAULT,
CONVERT(nvarchar(max), c.[value]) COLLATE DATABASE_DEFAULT
FROM rCTE r
CROSS APPLY OPENJSON(r.[Value]) c
WHERE ISJSON(r.[Value]) = 1
)
SELECT [Parent], [Key], [Value]
FROM rCTE
ORDER BY Id
结果:
Parent
Key
Value
Person
{"firstName": "John", "lastName": "Smith", "age": 25, "Address": {"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021"}, "PhoneNumbers": {"home":"212 555-1234", "fax":"646 555-4567" }}
Person
firstName
John
Person
lastName
Smith
Person
age
25
Person
Address
{"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021"}
Person
PhoneNumbers
{"home":"212 555-1234", "fax":"646 555-4567"}
PhoneNumbers
home
212 555-1234
PhoneNumbers
fax
646 555-4567
Address
streetAddress
21 2nd Street
Address
city
New York
Address
state
NY
Address
postalCode
10021
我有一个 JSON 字符串,如下所示。如何使用带有过程或函数的 SQL 服务器在下面创建 table 或类似的?谢谢大家
我正在使用 SQL 服务器 15.0.2080.9。
{
"Person": {
"firstName": "John",
"lastName": "Smith",
"age": 25,
"Address": {
"streetAddress":"21 2nd Street",
"city":"New York",
"state":"NY",
"postalCode":"10021"
},
"PhoneNumbers": {
"home":"212 555-1234",
"fax":"646 555-4567"
}
}
}
您可以使用Openjson,它会给您想要的结果。
这是您的特定示例 JSON:
DECLARE @Json NVARCHAR(max) = '{
"Person": {
"firstName": "John",
"lastName": "Smith",
"age": 25,
"Address": {
"streetAddress":"21 2nd Street",
"city":"New York",
"state":"NY",
"postalCode":"10021"
},
"PhoneNumbers": {
"home":"212 555-1234",
"fax":"646 555-4567"
}
}
}'
SELECT NULL AS Parent
,[KEY]
,[value]
FROM openjson(@json, '$')
UNION ALL
SELECT 'Person' AS Parent,
[KEY]
,[value]
FROM openjson(@json, '$.Person')
UNION ALL
SELECT 'Address'AS Parent,
[KEY]
,[value]
FROM openjson(@json, '$.Person.Address')
UNION ALL
SELECT 'PhoneNumbers' AS Parent ,[KEY]
,[value]
FROM openjson(@json, '$.Person.PhoneNumbers')
这是一个很好的起点
JSON:
DECLARE @json nvarchar(max) = N'
{
"Person": {
"firstName": "John",
"lastName": "Smith",
"age": 25,
"Address": {
"streetAddress":"21 2nd Street",
"city":"New York",
"state":"NY",
"postalCode":"10021"
},
"PhoneNumbers": {
"home":"212 555-1234",
"fax":"646 555-4567"
}
}
}'
声明:
;WITH rCTE AS (
SELECT
1 AS Id,
CONVERT(nvarchar(max), NULL) COLLATE DATABASE_DEFAULT AS [Parent],
CONVERT(nvarchar(max), N'Person') COLLATE DATABASE_DEFAULT AS [Key],
CONVERT(nvarchar(max), JSON_QUERY(@json, '$.Person')) COLLATE DATABASE_DEFAULT AS [Value]
UNION ALL
SELECT
r.Id + 1,
CONVERT(nvarchar(max), r.[Key]) COLLATE DATABASE_DEFAULT,
CONVERT(nvarchar(max), c.[Key]) COLLATE DATABASE_DEFAULT,
CONVERT(nvarchar(max), c.[value]) COLLATE DATABASE_DEFAULT
FROM rCTE r
CROSS APPLY OPENJSON(r.[Value]) c
WHERE ISJSON(r.[Value]) = 1
)
SELECT [Parent], [Key], [Value]
FROM rCTE
ORDER BY Id
结果:
Parent | Key | Value |
---|---|---|
Person | {"firstName": "John", "lastName": "Smith", "age": 25, "Address": {"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021"}, "PhoneNumbers": {"home":"212 555-1234", "fax":"646 555-4567" }} | |
Person | firstName | John |
Person | lastName | Smith |
Person | age | 25 |
Person | Address | {"streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021"} |
Person | PhoneNumbers | {"home":"212 555-1234", "fax":"646 555-4567"} |
PhoneNumbers | home | 212 555-1234 |
PhoneNumbers | fax | 646 555-4567 |
Address | streetAddress | 21 2nd Street |
Address | city | New York |
Address | state | NY |
Address | postalCode | 10021 |