简体   繁体   English

从 SQL 中的 Json 数组中提取所有值

[英]Extract all values from Json Array in SQL

I have SQL-data, with one column of JSON-data.我有 SQL 数据,其中有一列 JSON 数据。 Unfortunately, my database only compatibility level 100. So I can't use OPENJSON() .不幸的是,我的数据库只有兼容级别 100。所以我不能使用OPENJSON()

My JSON-data are structured as follows, it contains results from testing.我的 JSON 数据结构如下,它包含测试结果。 I also have the columns id , model and type .我还有列idmodeltype

[
{ "name": "rtc", "value": "pass" }, 
{ "name": "battery", "value": "pass" }, 
{ "name": "connection", "value": "pass" }, 
{ "name": "timer", "value": "pass" }, 
{ "name": "provide", "value": "pass" }, 
{ "name": "request", "value": "fail" }
]

How do I get columns for rtc , battery , connection , timer , provide and request with cells that are pass / fail ?如何获取rtcbatteryconnectiontimerproviderequest pass / fail的单元格的列?

Some products have all tests, while some only have a few.有些产品有所有测试,而有些产品只有少数。

I have tried JSON_Value(details, '$.name') , but that gives me null.我试过JSON_Value(details, '$.name') ,但这给了我空值。

EDIT Expected output table, Either of the works:编辑预期输出表,其中一项工作:

在此处输入图像描述

If your SQL Server version supports JSON, you may try to parse the stored JSON data and pivot the rows:如果您的 SQL Server 版本支持 JSON,您可以尝试解析存储的 JSON 数据并透视行:

Sample data:样本数据:

DECLARE @json nvarchar(max) = N'[
{ "name": "rtc", "value": "pass" }, 
{ "name": "battery", "value": "pass" }, 
{ "name": "connection", "value": "pass" }, 
{ "name": "timer", "value": "pass" }, 
{ "name": "provide", "value": "pass" }, 
{ "name": "request", "value": "fail" }
]'
SELECT *
INTO Data
FROM (VALUES (1, @json)) v (id, details)

Statement:陈述:

SELECT *
FROM (
   SELECT d.id, j.[name], j.[value]
   FROM Data d
   CROSS APPLY OPENJSON(d.details) WITH (
      [name] nvarchar(50) '$.name',
      [value] nvarchar(4) '$.value'
   ) j
) t
PIVOT (
   MAX([value]) FOR [name] IN ([rtc], [battery], [connection], [timer], [provide], [request])
) p

Result:结果:

id ID rtc实时时钟 battery电池 connection联系 timer计时器 provide提供 request要求
1 1 pass经过 pass经过 pass经过 pass经过 pass经过 fail失败

Note, that you may get the unpivoted values with the following statement:请注意,您可能会使用以下语句获得未透视的值:

SELECT d.id, j.[name], j.[value]
FROM Data d
CROSS APPLY OPENJSON(d.details) WITH (
   [name] nvarchar(50) '$.name',
   [value] nvarchar(4) '$.value'
) j

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM