将列值设置为JSON输出中的键

9gm1akwq  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(89)

假设我有这个SQL工作:

SELECT(
    SELECT 
        a.id,
        a.label,
        a.text
    FROM [data] a 
    FOR JSON PATH, INCLUDE_NULL_VALUES
) AS 'data'

字符串
它将生成具有以下结构的JSON:

[
    {
        "id": "N/A",
        "label": "test",
        "text": "Not applicable"
    },
    {
        "id": "ID",
        "label": "test2",
        "text": "Identification"
    }
]


我想要的是这个结构-标签列的值用作键。

[{
    "test": {
        "id": "N/A",
        "text": "Not applicable"
    },
    "test2": {
        "id": "ID",
        "text": "Identification"
    }
}]


有没有可能使用SQL(而不是通过字符串构建JSON)?

vd8tlhqk

vd8tlhqk1#

不幸的是,SQL Server还不支持JSON_OBJECT_AGG,而JSON_OBJECT_AGG本来可以很好地工作。
您可以使用STRING_AGGSTRING_ESCAPE,并使用嵌套的FOR JSON子查询。

适用于SQL Server 2017+。

SELECT
  data = '[{' +
    STRING_AGG(
      '"' + STRING_ESCAPE(a.label, 'json') + '":' + j.json,
      ','
    ) + '}]'
FROM [data] a
CROSS APPLY (
    SELECT
      a.id,
      a.text
    FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER
) j(json);

字符串

31moq8wy

31moq8wy2#

您可以使用FORXML连接/聚合id和text的FORJSON PATH

SELECT N'[{'+STUFF((
SELECT N',"'+STRING_ESCAPE(D.label,'json')+N'":',(SELECT D.id,D.text FOR JSON PATH,INCLUDE_NULL_VALUES,WITHOUT_ARRAY_WRAPPER)
FROM data D FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)'),1,1,N'')+N'}]'

字符串

相关问题