SQL OPENJSON 到单列

Posted

技术标签:

【中文标题】SQL OPENJSON 到单列【英文标题】:SQL OPENJSON to Single Column 【发布时间】:2019-12-16 15:14:25 【问题描述】:

我有以下数据;

DECLARE @json NVARCHAR(2048) = N'
    "searchId": -1,
    "statuses": [
        33,
        85,
        90
        ]
';

并从这里执行返回;

SELECT searchID
    ,x.statuses
FROM OpenJson(@json) WITH (
        searchID VARCHAR(200) '$.searchId'
        ,statuses NVARCHAR(MAX) '$.statuses' AS JSON
        )
CROSS APPLY OPENJSON(statuses, '$') WITH (statuses int '$') AS x

然后返回;

searchID    statuses
-1          33
-1          85
-1          90

它可以工作,但是 id 喜欢返回作为单行,所以“状态”列显示为

searchID    statuses
-1          33,85,90

我主要使用 Stuff() 和 ForXML 尝试了几种方法,但是我认为肯定会有一种更清洁的方式来操作 json 吗?

【问题讨论】:

如果您使用的是 SQL Server 2017,请使用 STRING_AGG。否则需要使用FOR XML PATH 方法。 【参考方案1】:

您可以将状态保留为 JSON,并将演示文稿留给前端。

DECLARE @json NVARCHAR(2048) = N'
    "searchId": -1,
    "statuses": [33,85,90]
';

SELECT searchID
    ,x.statuses
FROM OpenJson(@json) WITH (
        searchID VARCHAR(200) '$.searchId'
        ,statuses NVARCHAR(MAX) '$.statuses' AS JSON
        ) x

输出

searchID              statuses
--------------------- -----------
-1                    [33,85,90]

或者只是从 JSON 数组中删除 '[' 和 ']':

DECLARE @json NVARCHAR(2048) = N'
    "searchId": -1,
    "statuses": [33,85,90]
';

SELECT searchID
    ,substring(x.statuses,2,LEN(x.statuses)-2) statuses
FROM OpenJson(@json) WITH (
        searchID VARCHAR(200) '$.searchId'
        ,statuses NVARCHAR(MAX) '$.statuses' AS JSON
        ) x

输出

searchID              statuses
--------------------- -----------
-1                    33,85,90

【讨论】:

【参考方案2】:

STRING_AGGvarchar

DECLARE @json NVARCHAR(2048) = N'
    "searchId": -1,
    "statuses": [
        33,
        85,
        90
        ]
';
--
SELECT searchID, string_agg(x.statuses, ',') statuses
FROM OpenJson(@json) WITH (
        searchID VARCHAR(200) '$.searchId'
        ,statuses NVARCHAR(MAX) '$.statuses' AS JSON
        )
CROSS APPLY OPENJSON(statuses, '$') WITH (statuses int '$') AS x
GROUP BY searchID;

【讨论】:

以上是关于SQL OPENJSON 到单列的主要内容,如果未能解决你的问题,请参考以下文章

如何从 SQL Server 中的动态节点加载 OPENJSON

SQL Server Openjson 将详细信息提取到表中

使用 C# 和 OPENJSON 将 JSON 插入 SQL Server 2016

OPENJSON 在 SQL Server 中不起作用?

SQL OPENJSON - 解析 JSON 数组

如何实现 OPENJSON 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?