0

我有以下数据;

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 吗?

4

2 回答 2

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
于 2019-12-16T15:21:15.283 回答
0

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;
于 2019-12-16T15:31:12.390 回答