Select JSON 来自 SQL table 的值并将结果转换为单个 JSON 对象
Select JSON values from a SQL table and convert the result into a single JSON object
我到处搜索,但似乎找不到任何像我正在尝试做的那样的东西,但我确信这不是什么新鲜事,我很确定我是有一个荷马时刻。
给定包含 JSON 列的 table:
DECLARE @Table TABLE
(
[VALUE] nvarchar(max) NOT NULL
);
列中的值可以是任何有效的值 JSON OBJECT
,我无法控制数据,只有它是有效的并且所有条目都具有相同的结构但我不知道.这很重要,因为它确实限制了某些可用选项。
INSERT INTO @Table
VALUES ( N'{"X":"2020-01-01","Y":"27"}' )
, ( N'{"X":"2020-02-01","Y":"48"}' )
, ( N'{"X":"2020-04-01","Y":"63"}' )
, ( N'{"X":"2020-05-01","Y":"75"}' )
, ( N'{"X":"2020-06-01","Y":"32"}' )
, ( N'{"X":"2020-08-01","Y":"12"}' )
, ( N'{"X":"2020-09-01","Y":"96"}' )
, ( N'{"X":"2020-10-01","Y":"105"}' );
INSERT INTO @Table
VALUES ( N'{"Monkey":"1","Elephant":"9"}' )
, ( N'{"Monkey":"2","Elephant":"8"}' )
, ( N'{"Monkey":"3","Elephant":"7"}' )
, ( N'{"Monkey":"4","Elephant":"6"}' )
, ( N'{"Monkey":"5","Elephant":"5"}' )
, ( N'{"Monkey":"6","Elephant":"4"}' )
, ( N'{"Monkey":"7","Elephant":"3"}' )
, ( N'{"Monkey":"8","Elephant":"2"}' );
我需要能够将所有行的内容转换成一个 JSON Document
:
[{
"VALUES": [
{ "X": "2020-01-01", "Y": "27" },
{ "X": "2020-02-01", "Y": "48" },
{ "X": "2020-04-01", "Y": "63" },
{ "X": "2020-05-01", "Y": "75" },
{ "X": "2020-06-01", "Y": "32" },
{ "X": "2020-08-01", "Y": "12" },
{ "X": "2020-09-01", "Y": "96" },
{ "X": "2020-10-01", "Y": "105" }
]
}]
根据我的 SELECT
语句,我至少可以将数据查询到 table 结果:
SELECT [VALUES] = JSON_QUERY( [VALUE], N'$' )
FROM @Table;
VALUES
{"X":"2020-01-01","Y":"27"}
{"X":"2020-02-01","Y":"48"}
{"X":"2020-04-01","Y":"63"}
{"X":"2020-05-01","Y":"75"}
{"X":"2020-06-01","Y":"32"}
{"X":"2020-08-01","Y":"12"}
{"X":"2020-09-01","Y":"96"}
{"X":"2020-10-01","Y":"105"}
但是当我将结果转换为 JSON
时,它出错了:
SELECT [VALUES] = JSON_QUERY( [VALUE], N'$' )
FROM @Table
FOR JSON PATH;
[
{ "VALUES": { "X": "2020-01-01", "Y": "27" } },
{ "VALUES": { "X": "2020-02-01", "Y": "48" } },
{ "VALUES": { "X": "2020-04-01", "Y": "63" } },
{ "VALUES": { "X": "2020-05-01", "Y": "75" } },
{ "VALUES": { "X": "2020-06-01", "Y": "32" } },
{ "VALUES": { "X": "2020-08-01", "Y": "12" } },
{ "VALUES": { "X": "2020-09-01", "Y": "96" } },
{ "VALUES": { "X": "2020-10-01", "Y": "105" } }
]
对于我来说,我似乎无法整理最后一点,希望另一双更聪明的眼睛能发现我的错误。
如果你能保证 table 包含有效的 JSON,那么下面是一个快速但肮脏的解决方案。不使用任何 Microsoft SQL 服务器 JSON 支持,但一些字符串连接...
-- SQL SERVER 2016
select '[{ "VALUES":['
+ stuff(( select ',' + t.[VALUE]
from @Table t
for xml path(''), type).value('.', 'nvarchar(max)'), 1,1,'')
+ ']}]';
-- SQL SERVER 2017 and later
select '[{ "VALUES":[' + string_agg(t.VALUE, ',') + ']}]' from @Table t;
Formatted第一组样本数据的结果:
[
{
"VALUES": [
{
"X": "2020-01-01",
"Y": "27"
},
{
"X": "2020-02-01",
"Y": "48"
},
{
"X": "2020-04-01",
"Y": "63"
},
{
"X": "2020-05-01",
"Y": "75"
},
{
"X": "2020-06-01",
"Y": "32"
},
{
"X": "2020-08-01",
"Y": "12"
},
{
"X": "2020-09-01",
"Y": "96"
},
{
"X": "2020-10-01",
"Y": "105"
}
]
}
]
我到处搜索,但似乎找不到任何像我正在尝试做的那样的东西,但我确信这不是什么新鲜事,我很确定我是有一个荷马时刻。
给定包含 JSON 列的 table:
DECLARE @Table TABLE
(
[VALUE] nvarchar(max) NOT NULL
);
列中的值可以是任何有效的值 JSON OBJECT
,我无法控制数据,只有它是有效的并且所有条目都具有相同的结构但我不知道.这很重要,因为它确实限制了某些可用选项。
INSERT INTO @Table
VALUES ( N'{"X":"2020-01-01","Y":"27"}' )
, ( N'{"X":"2020-02-01","Y":"48"}' )
, ( N'{"X":"2020-04-01","Y":"63"}' )
, ( N'{"X":"2020-05-01","Y":"75"}' )
, ( N'{"X":"2020-06-01","Y":"32"}' )
, ( N'{"X":"2020-08-01","Y":"12"}' )
, ( N'{"X":"2020-09-01","Y":"96"}' )
, ( N'{"X":"2020-10-01","Y":"105"}' );
INSERT INTO @Table
VALUES ( N'{"Monkey":"1","Elephant":"9"}' )
, ( N'{"Monkey":"2","Elephant":"8"}' )
, ( N'{"Monkey":"3","Elephant":"7"}' )
, ( N'{"Monkey":"4","Elephant":"6"}' )
, ( N'{"Monkey":"5","Elephant":"5"}' )
, ( N'{"Monkey":"6","Elephant":"4"}' )
, ( N'{"Monkey":"7","Elephant":"3"}' )
, ( N'{"Monkey":"8","Elephant":"2"}' );
我需要能够将所有行的内容转换成一个 JSON Document
:
[{
"VALUES": [
{ "X": "2020-01-01", "Y": "27" },
{ "X": "2020-02-01", "Y": "48" },
{ "X": "2020-04-01", "Y": "63" },
{ "X": "2020-05-01", "Y": "75" },
{ "X": "2020-06-01", "Y": "32" },
{ "X": "2020-08-01", "Y": "12" },
{ "X": "2020-09-01", "Y": "96" },
{ "X": "2020-10-01", "Y": "105" }
]
}]
根据我的 SELECT
语句,我至少可以将数据查询到 table 结果:
SELECT [VALUES] = JSON_QUERY( [VALUE], N'$' )
FROM @Table;
VALUES
{"X":"2020-01-01","Y":"27"}
{"X":"2020-02-01","Y":"48"}
{"X":"2020-04-01","Y":"63"}
{"X":"2020-05-01","Y":"75"}
{"X":"2020-06-01","Y":"32"}
{"X":"2020-08-01","Y":"12"}
{"X":"2020-09-01","Y":"96"}
{"X":"2020-10-01","Y":"105"}
但是当我将结果转换为 JSON
时,它出错了:
SELECT [VALUES] = JSON_QUERY( [VALUE], N'$' )
FROM @Table
FOR JSON PATH;
[
{ "VALUES": { "X": "2020-01-01", "Y": "27" } },
{ "VALUES": { "X": "2020-02-01", "Y": "48" } },
{ "VALUES": { "X": "2020-04-01", "Y": "63" } },
{ "VALUES": { "X": "2020-05-01", "Y": "75" } },
{ "VALUES": { "X": "2020-06-01", "Y": "32" } },
{ "VALUES": { "X": "2020-08-01", "Y": "12" } },
{ "VALUES": { "X": "2020-09-01", "Y": "96" } },
{ "VALUES": { "X": "2020-10-01", "Y": "105" } }
]
对于我来说,我似乎无法整理最后一点,希望另一双更聪明的眼睛能发现我的错误。
如果你能保证 table 包含有效的 JSON,那么下面是一个快速但肮脏的解决方案。不使用任何 Microsoft SQL 服务器 JSON 支持,但一些字符串连接...
-- SQL SERVER 2016
select '[{ "VALUES":['
+ stuff(( select ',' + t.[VALUE]
from @Table t
for xml path(''), type).value('.', 'nvarchar(max)'), 1,1,'')
+ ']}]';
-- SQL SERVER 2017 and later
select '[{ "VALUES":[' + string_agg(t.VALUE, ',') + ']}]' from @Table t;
Formatted第一组样本数据的结果:
[
{
"VALUES": [
{
"X": "2020-01-01",
"Y": "27"
},
{
"X": "2020-02-01",
"Y": "48"
},
{
"X": "2020-04-01",
"Y": "63"
},
{
"X": "2020-05-01",
"Y": "75"
},
{
"X": "2020-06-01",
"Y": "32"
},
{
"X": "2020-08-01",
"Y": "12"
},
{
"X": "2020-09-01",
"Y": "96"
},
{
"X": "2020-10-01",
"Y": "105"
}
]
}
]