Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL OPENJSON到单列_Sql_Json_Sql Server_Open Json - Fatal编程技术网

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
方法。