SQL表中JSON项的查询未按预期工作

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

我一直在用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 /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)
()。但是为了插入到其他表中,它应该仍然是兼容的。啊,这是一种我比较熟悉但不知道如何格式化的方法,我可能最终会利用这两种方法。知识有帮助!也谢谢你,佐洛夫!!!:)啊,这是一种我比较熟悉但不知道如何格式化的方法,我可能最终会利用这两种方法。知识有帮助!也谢谢你,佐洛夫!!!:)