[英]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
.我还有列
id
、 model
和type
。
[
{ "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
?如何获取
rtc
、 battery
、 connection
、 timer
、 provide
和request
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 ![]() |
rtc![]() |
battery![]() |
connection![]() |
timer![]() |
provide![]() |
request![]() |
---|---|---|---|---|---|---|
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.