如何使用行中的值按行构造JSON SQL?

时间:2018-10-24 16:18:53

标签: sql json sql-server

我正在努力使用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完成我要获取的内容?

2 个答案:

答案 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"
    }
}