SQL表中JSON项的查询未按预期工作
我一直在用JSON数据填充SQL Server,并查询出所需的特定数据 我有一个似乎与API略有不同的格式,我似乎看不到获得所需的模式 从API返回的数据如下所示,并存储在SQL Server中的一行中SQL表中JSON项的查询未按预期工作,sql,arrays,json,sql-server,Sql,Arrays,Json,Sql Server,我一直在用JSON数据填充SQL Server,并查询出所需的特定数据 我有一个似乎与API略有不同的格式,我似乎看不到获得所需的模式 从API返回的数据如下所示,并存储在SQL Server中的一行中 {"extrapolationLevel":1,"branchNames":["name"],"leafNames":["count(*)"],"values":{"Loading of page /webpage/page/Page1.asp":[4],"Loading of page /we
{"extrapolationLevel":1,"branchNames":["name"],"leafNames":["count(*)"],"values":{"Loading of page /webpage/page/Page1.asp":[4],"Loading of page /webpage/page/Page3.asp":[4],"Loading of page /webpage/page/Page2.asp":[3],"Loading of page /webpage/page/Page4.asp":[2],"Loading of page /webpage/page/Page5.asp":[7],"Loading of page /webpage/page/Page6.asp":[3]}}
当我以JSON格式查看数据时,我看到的是:
我正在尝试修改以前的查询以提取名称和计数:
比如说。。我想要显示来自JSON的数据的结果,以及
两种价值观都有
范例
Date Page Name Value
---------------------------------------------------------------------------
2019-11-18 09:22:14.657 Loading of page /webpage/page/Page3.asp 4
我不确定如何包括这一点——返回的页面名称(“加载页面/webpage/page/PageX.asp”)
这次不同的是,我没有得到页面值或计数
我做错了什么
这是输出的图像-我无法获取页面名称
我的问题是:
SELECT d.[DATE], j.*
FROM JSON_TABLE d
CROSS APPLY OPENJSON(d.log, '$.values')
WITH ([PageCount] int '$."Loading of page /webpage/page/Page1.asp"[0]') j
更新:
我现在有了这个查询“几乎到了”,如何摆脱围绕返回值(括号)的JSON支架
SELECT d.[DATE], x.[key], x.[value]
FROM JSON_Table as d
CROSS APPLY OPENJSON(JSON_QUERY(d.log, '$.values')) AS X;
要获取当前属性的键和值,请分别使用
[key]
和[value]
。要从这些对象中提取值,需要使用json\u value
select d.[date], x.[key], json_value(x.[value], '$[0]')
from json_table d
cross apply openjson(d.[log], '$.values') x
要获取当前属性的键和值,请分别使用
[key]
和[value]
。要从这些对象中提取值,需要使用json\u value
select d.[date], x.[key], json_value(x.[value], '$[0]')
from json_table d
cross apply openjson(d.[log], '$.values') x
另一种可能的方法是使用
OPENJSON()
两次-使用默认模式和显式模式(使用子句),因为在Log
列中嵌套了JSON
对象。使用默认模式时,结果是一个表,其中包含列键
、值
和类型
。使用显式架构时,可以在结果表中定义列和列的类型
请注意,JSON\u VALUE()
类型为nvarchar(4000)
的单个文本值
JSON和表:
DECLARE @json nvarchar(max) = N'{
"extrapolationLevel":1,
"branchNames":[
"name"
],
"leafNames":[
"count(*)"
],
"values":{
"Loading of page /webpage/page/Page1.asp":[
4
],
"Loading of page /webpage/page/Page3.asp":[
4
],
"Loading of page /webpage/page/Page2.asp":[
3
],
"Loading of page /webpage/page/Page4.asp":[
2
],
"Loading of page /webpage/page/Page5.asp":[
7
],
"Loading of page /webpage/page/Page6.asp":[
3
]
}
}'
CREATE TABLE Data (
[Date] datetime,
[Log] nvarchar(max)
)
INSERT INTO Data
([Date], [Log])
VALUES
(GETDATE(), @json)
声明:
SELECT
d.[Date],
j1.[key] AS [Page],
j2.[Count]
FROM Data d
CROSS APPLY OPENJSON(d.[Log], '$.values') j1
CROSS APPLY OPENJSON(j1.[value]) WITH (
[Count] int '$'
) j2
结果:
Date Page Count
18/11/2019 17:48:02 Loading of page /webpage/page/Page1.asp 4
18/11/2019 17:48:02 Loading of page /webpage/page/Page3.asp 4
18/11/2019 17:48:02 Loading of page /webpage/page/Page2.asp 3
18/11/2019 17:48:02 Loading of page /webpage/page/Page4.asp 2
18/11/2019 17:48:02 Loading of page /webpage/page/Page5.asp 7
18/11/2019 17:48:02 Loading of page /webpage/page/Page6.asp 3
另一种可能的方法是使用
OPENJSON()
两次-使用默认模式和显式模式(使用子句),因为在Log
列中嵌套了JSON
对象。使用默认模式时,结果是一个表,其中包含列键
、值
和类型
。使用显式架构时,可以在结果表中定义列和列的类型
请注意,JSON\u VALUE()
类型为nvarchar(4000)
的单个文本值
JSON和表:
DECLARE @json nvarchar(max) = N'{
"extrapolationLevel":1,
"branchNames":[
"name"
],
"leafNames":[
"count(*)"
],
"values":{
"Loading of page /webpage/page/Page1.asp":[
4
],
"Loading of page /webpage/page/Page3.asp":[
4
],
"Loading of page /webpage/page/Page2.asp":[
3
],
"Loading of page /webpage/page/Page4.asp":[
2
],
"Loading of page /webpage/page/Page5.asp":[
7
],
"Loading of page /webpage/page/Page6.asp":[
3
]
}
}'
CREATE TABLE Data (
[Date] datetime,
[Log] nvarchar(max)
)
INSERT INTO Data
([Date], [Log])
VALUES
(GETDATE(), @json)
声明:
SELECT
d.[Date],
j1.[key] AS [Page],
j2.[Count]
FROM Data d
CROSS APPLY OPENJSON(d.[Log], '$.values') j1
CROSS APPLY OPENJSON(j1.[value]) WITH (
[Count] int '$'
) j2
结果:
Date Page Count
18/11/2019 17:48:02 Loading of page /webpage/page/Page1.asp 4
18/11/2019 17:48:02 Loading of page /webpage/page/Page3.asp 4
18/11/2019 17:48:02 Loading of page /webpage/page/Page2.asp 3
18/11/2019 17:48:02 Loading of page /webpage/page/Page4.asp 2
18/11/2019 17:48:02 Loading of page /webpage/page/Page5.asp 7
18/11/2019 17:48:02 Loading of page /webpage/page/Page6.asp 3
请显示您的查询当前输出的内容,以便我们查看错误行为。已添加。非常感谢。我似乎没有得到页面名称:)我可能错了,但您似乎没有声明值应为
'$的字段。加载page/webpage/page/Page1.asp“[0]”
我不清楚如何添加该字段。这是另一个十字架吗?它需要什么格式?只需获取该路径中条目的[Key]
?请显示您的查询当前输出的内容,以便我们查看错误行为。已添加。非常感谢。我似乎没有得到页面名称:)我可能错了,但您似乎没有声明值应为'$的字段。加载page/webpage/page/Page1.asp“[0]”
我不清楚如何添加该字段。这是另一个十字架吗?它需要什么格式?只需获取该路径中条目的[Key]
?成功了。。顺便提一下如果我使用insert,这个函数会将值存储为int吗?应该,json中的值是一个数字,所以它应该保持其类型。如果不是一个数字,你必须做适当的转换。感谢这个社区帮助我学会提出更好的问题,并在我过去尝试过的基础上发展。这是一条Looonnnggg路。。但至少沿途有友好的导游!看来我搞错了json\u value
的返回值类型。该类型实际上是nvarchar(4000)
()。但是为了插入到其他表中,它仍然应该是兼容的。。顺便提一下如果我使用insert,这个函数会将值存储为int吗?应该,json中的值是一个数字,所以它应该保持其类型。如果不是一个数字,你必须做适当的转换。感谢这个社区帮助我学会提出更好的问题,并在我过去尝试过的基础上发展。这是一条Looonnnggg路。。但至少沿途有友好的导游!看来我搞错了json\u value
的返回值类型。该类型实际上是nvarchar(4000)
()。但是为了插入到其他表中,它应该仍然是兼容的。啊,这是一种我比较熟悉但不知道如何格式化的方法,我可能最终会利用这两种方法。知识有帮助!也谢谢你,佐洛夫!!!:)啊,这是一种我比较熟悉但不知道如何格式化的方法,我可能最终会利用这两种方法。知识有帮助!也谢谢你,佐洛夫!!!:)