我正在努力使用SQL构建JSON。
说我有一个这样的表:
any
我正在尝试获得如下结构:
| col1 | col2 | col3 |
+---------------+----------+----------+
| specialvalue | someval | someval |
| specialvalue2 | someval2 | someval2 |
| | | |
我该如何完成?在映射集合中的每一行时,可以将JSON_MODIFY与动态键一起使用吗?
我得到的最接近的是:
{
"specialvalue": {
"specialcol": "specialvalue",
"col2": "someval",
"col3": "someval"
},
"specialvalue2": {
"specialcol": "specialvalue2",
"col2": "someval2",
"col3": "someval2"
}
}
哪个返回以下内容:
SELECT
specialcol,
col2,
col3
INTO #tmpTbl
FROM myTable
SELECT
specialcol,
(SELECT * FROM #tmpTbl FOR JSON AUTO) as 'Value'
FROM #tmpTbl
FOR JSON AUTO
DROP TABLE #tmp
距离很近,但不是我所需要的。
有没有一种方法可以使用JSON_MODIFY完成我要获取的内容?
答案 0 :(得分:1)
根据我的评论和思考。不是最优雅的,但有可能带您到达那里。
内联查询以在json中获取结果,然后基于col1中的值将这些结果包装为键。将所有内容以逗号分隔,然后放在方括号中。
DECLARE @TestData TABLE
(
[col1] NVARCHAR(100)
, [col2] NVARCHAR(100)
, [col3] NVARCHAR(100)
);
DECLARE @JsonValue NVARCHAR(MAX) = '';
INSERT INTO @TestData (
[col1]
, [col2]
, [col3]
)
VALUES ( 'specialvalue', 'someval', 'someval' )
, ( 'specialvalue2', 'someval2', 'someval2' );
SELECT @JsonValue = @JsonValue + N'"' + [a].[col1] + N'": '
+ (
SELECT [aa].[col1] AS 'specialvalue'
, [aa].[col2] AS 'col2'
, [aa].[col3] AS 'col3'
FROM @TestData [aa]
WHERE [aa].[col1] = [a].[col1]
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) + N','
FROM @TestData [a];
SET @JsonValue = N'{' + SUBSTRING(@JsonValue, 1, LEN(@JsonValue) - 1) + N'}';
SELECT @JsonValue;
给你这个:
{
"specialvalue": {
"specialvalue": "specialvalue",
"col2": "someval",
"col3": "someval"
},
"specialvalue2": {
"specialvalue": "specialvalue2",
"col2": "someval2",
"col3": "someval2"
}
}
答案 1 :(得分:0)
SQL Server 2017-
;WITH cte as (
select 'specialvalue' as specialcol, 'someval' col2, 'someval' col3 union
select 'specialvalue2' as specialcol, 'someval2' col2, 'someval2' col3 )
SELECT
CASE WHEN specialcol = 'specialvalue' THEN specialcol END as [specialvalue.specialcol],
CASE WHEN specialcol = 'specialvalue' THEN col2 END as [specialvalue.col2],
CASE WHEN specialcol = 'specialvalue' THEN col3 END as [specialvalue.col3],
CASE WHEN specialcol = 'specialvalue2' THEN specialcol END as [specialvalue2.specialcol],
CASE WHEN specialcol = 'specialvalue2' THEN col2 END as [specialvalue2.col2],
CASE WHEN specialcol = 'specialvalue2' THEN col3 END as [specialvalue2.col3]
FROM cte
FOR JSON PATH
输出:
{
"specialvalue":{
"specialcol":"specialvalue",
"col2":"someval",
"col3":"someval"
}
},
{
"specialvalue2":{
"specialcol":"specialvalue2",
"col2":"someval2",
"col3":"someval2"
}
}