SQL OPENJSON到单列
我有以下数据SQL OPENJSON到单列,sql,json,sql-server,open-json,Sql,Json,Sql Server,Open Json,我有以下数据 DECLARE@json-NVARCHAR(2048)=N'{ “searchId”:-1, “状态”:[ 33, 85, 90 ] }'; 并从中执行返回操作 选择searchID ,x.状态 从OpenJson(@json)到( searchID VARCHAR(200)“$.searchID” ,statuses NVARCHAR(最大)“$.statuses”作为JSON ) 交叉应用OPENJSON(状态“$”)和(状态int“$”)作为x 和返回 searchID
DECLARE@json-NVARCHAR(2048)=N'{
“searchId”:-1,
“状态”:[
33,
85,
90
]
}';
并从中执行返回操作
选择searchID
,x.状态
从OpenJson(@json)到(
searchID VARCHAR(200)“$.searchID”
,statuses NVARCHAR(最大)“$.statuses”作为JSON
)
交叉应用OPENJSON(状态“$”)和(状态int“$”)作为x
和返回
searchID statuses
-1 33
-1 85
-1 90
它可以工作,但是我希望返回是一行,所以“statuses”列显示为
searchID statuses
-1 33,85,90
我尝试过几种方法,主要是使用Stuff()和ForXML,但我认为肯定会有一种更干净的方法来处理json?您可以将状态保留为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]
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]
searchID statuses
--------------------- -----------
-1 33,85,90
STRING\u 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 Server 2017,请使用
STRING\u AGG
。否则,您需要使用FOR XML PATH
方法。