sql - 解析包含多个数组和键的 JSON 列
问题描述
我已经通过一些示例/教程尝试使用 SQL Server (2017) 中的 JSON 函数解析包含多个数组的 JSON 列,但是我仍然无法尝试解析以下 JSON 格式,如下所示.
出于示例目的 - 我将在下面的代码示例中将其声明为 @json 变量。我已经尝试了多次迭代来尝试提取这些值,所以这是我在尝试解析下面显示的示例时停止的地方。
DECLARE @json nvarchar(max)
SET @json = N'[
[
{
"Title": "Title 1",
"Property": "String1",
"Value": "123456",
"ValueArray": [
""
],
"SecondaryValue": null,
"SelectedItem": null
},
{
"Title": "Title 2",
"Property": "String2",
"Value": "54321",
"ValueArray": [
""
],
"SecondaryValue": null,
"SelectedItem": null
}
],
[
{
"Title": "Title 3",
"Property": "String3",
"Value": "33333333",
"ValueArray": [
""
],
"SecondaryValue": null,
"SelectedItem": null
},
{
"Title": "Title 4",
"Property": "String4",
"Value": "44444444",
"ValueArray": [
""
],
"SecondaryValue": null,
"SelectedItem": null
}
]
]'
SELECT JSON_VALUE(j.value, '$.Title') AS 'Title Output', j.[key], j.Value, JSON_VALUE(j.value, '$.Title[0]') AS Title1
--STRING_AGG('Value: ' + v.[value] + ' Title: ' + t.[value], ', ') AS [Values]
FROM OPENJSON(@json) j
随着 JSON 格式存储到列中的方式,我希望获得所有标题和值,如下所示。
预期输出列
标题 1 - 123456,标题 2 - 54321,标题 3 - 33333333,标题 4 - 44444444
我还尝试在解析数据之前更改 JSON 字符串,例如预先添加一个数组名称,以帮助识别集合成员的位置,但是我只能获得第一个标题和值。
解决方案
[]
它包含一个带有对象的数组数组{}
您可以CROSS APPLY
通过数组的值来获取元素。
这是一个使用表格的示例。
但这对于变量来说是相同的原理。
CREATE TABLE test ( id int identity(1,1) primary key, jsonCol nvarchar(max) ); INSERT INTO test VALUES (N'[ [ { "Title": "Title 1", "Property": "String1", "Value": "123456", "ValueArray": [ "" ], "SecondaryValue": null, "SelectedItem": null }, { "Title": "Title 2", "Property": "String2", "Value": "54321", "ValueArray": [ "" ], "SecondaryValue": null, "SelectedItem": null } ], [ { "Title": "Title 3", "Property": "String3", "Value": "33333333", "ValueArray": [ "" ], "SecondaryValue": null, "SelectedItem": null }, { "Title": "Title 4", "Property": "String4", "Value": "44444444", "ValueArray": [ "" ], "SecondaryValue": null, "SelectedItem": null } ] ]');
询问:
SELECT id, a.[Values] FROM test t OUTER APPLY ( SELECT STRING_AGG(CONCAT( JSON_VALUE(obj.value,'$.Title'), ' - ', JSON_VALUE(obj.value,'$.Value') ), ', ') AS [Values] FROM OPENJSON(t.jsonCol) AS arr CROSS APPLY OPENJSON(arr.Value) AS obj ) a;
结果:
编号 | 价值观 -: | :------------------------------------------------ ---------------------- 1 | 标题 1 - 123456,标题 2 - 54321,标题 3 - 33333333,标题 4 - 44444444
在这里测试db<>fiddle
推荐阅读
- postgresql - Rails 5 和 Postgres - 我可以使用“?” 在字段名称中?
- neo4j - 使用可变 MATCH 标签动态创建 Neo4j/Cypher 关系
- objective-c - 从首选项窗格注册登录项的最佳方法?
- javascript - Image resize using JAVAScript returning empty image
- javascript - 如何在带有窗口的对象中创建新值
- android-studio - 新手机上未安装应用程序
- c# - Drag and Drop from Explorer not working for C# Winforms App
- r - R: object of type 'closure' is not subsettable (Rshiny problem)
- python - OpenCV copying a list of pixels from one image to another
- c# - Multitasking with windows service