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_AGG
回varchar
。
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 将 JSON 代码作为列中的文本。如何在 AZURE SQL Dataware House 中的表列上使用 OPENJSON?