将JSON数组作为SQL表列之一读取
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将JSON数组作为SQL表列之一读取相关的知识,希望对你有一定的参考价值。
我正在尝试将json数组读入表中,数组中的一个节点(语言)本身就是一个数组,我正在为这个特定的列(语言)获取null
。
以下是json示例:
DECLARE @json NVARCHAR(MAX) = '[
{
"Id":1,
"Name":"Test1",
"Languages":["L1", "L2"]
},
{
"Id":2,
"Name":"Test2",
"Languages":["L3", "L4"]
},
{
"Id":3,
"Name":"Test2",
"Languages":["L5", "L6"]
}]'
以下是我使用的查询:
SELECT Id
, Name
, Languages
FROM OPENJSON(@json)
WITH (Id INT '$.Id'
, Name VARCHAR(20) '$.Name'
, Languages VARCHAR(200) '$.Languages')
以下是当前结果:
但是我需要如下结果
我究竟做错了什么?请帮忙。
答案
您可以在NVARCHAR(max) as json
子句中使用WITH
作为语言项。
来自Microsoft docs(所有细节都可以找到here):
如果未为列指定AS JSON,则该函数将从指定路径上的指定JSON属性返回标量值(例如,int,string,true,false)。如果路径表示对象或数组,并且在指定路径中找不到该属性,则该函数在松弛模式下返回null或在严格模式下返回错误。此行为类似于JSON_VALUE函数的行为。
所以你的查询应该是这样的:
SELECT Id
, Name
, Languages
FROM OPENJSON(@json)
WITH (Id INT '$.Id'
, Name VARCHAR(20) '$.Name'
, Languages NVARCHAR(max) as json)
结果:
另一答案
我希望这个查询可能对你有帮助。结果与您想要的有点不同。
DECLARE @json NVARCHAR(MAX) = '{"UserLang":[
{
"Id":1,
"Name":"Test1",
"Languages":["L1", "L2"]
},
{
"Id":2,
"Name":"Test2",
"Languages":["L3", "L4"]
},
{
"Id":3,
"Name":"Test2",
"Languages":["L5", "L6"]
}]}'
SELECT
JSON_VALUE(d.value,'$.Id') AS Id,
JSON_VALUE(d.value,'$.Name') AS Languages,
l.value AS Name
FROM OPENJSON(@json,'$.UserLang') AS d CROSS APPLY OPENJSON (d.value,'$.Languages') AS l
以上是关于将JSON数组作为SQL表列之一读取的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark:将数据帧作为 JSON 存储在 MySQL 表列中