如何强制SQL Server返回空JSON数组

时间:2016-09-19 06:12:45

标签: sql-server json sql-server-2016

我使用SQL Server 2016,它支持JSON PATH返回JSON字符串。 我想知道如何只获得一个简单的空json数组,我的意思是[]当我的查询或子查询返回null时。我已尝试过此查询:

SELECT '' AS TEST
FOR JSON PATH,ROOT('arr')

返回:

{"arr":[{"test":""}]}

还有这一个:

SELECT NULL AS TEST
FOR JSON PATH,ROOT('arr')

返回:

{"arr":[{}]}

它更好但仍然不正确,我需要这个:

{"arr":[]}

5 个答案:

答案 0 :(得分:5)

这样可以,并且可以在另一个for json查询中编写:

select json_query('[]') arr 
    for json path, without_array_wrapper

答案 1 :(得分:3)

您可以随时使用ISNULL进行检查,例如:

select ISNULL( (SELECT * FROM sys.tables where 1=2 FOR JSON PATH), '[]')

如果你在app层中需要这个,也许最好检查数据访问代码中是否设置了一些结果,如果不是只返回[]或{}。

答案 2 :(得分:1)

一个小手册,但如果您需要快速入侵,请转到:

DECLARE @JSON NVARCHAR(MAX) = (SELECT NULL AS test
FOR JSON PATH,ROOT('arr'))


SELECT REPLACE(@json, '{}', '')

答案 3 :(得分:0)

JSON_QUERY('[]') AS [features]本身并不适合我。我发现结果的格式如下:

"features":"[]"

这是不可取的。

要获得所需的结果,我需要将JSON存储在变量中,然后对结果执行REPLACE,如下所示:

DECLARE @json VARCHAR(MAX) = (SELECT JSON_QUERY('[]') AS [features],
                                     -- Other selected fields elided for brevity 
                                FROM MyTable
                                 FOR JSON, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES);

SET @json = REPLACE(@json, '"features":"[]"', '"features":[]');

SELECT @json;

是的,这是一个可怕的骇客。但这有效,并返回我想要的结果。我们的客户绝对必须返回一个空数组,这是我发现以确保它存在的最佳方法。

答案 4 :(得分:0)

现在我遇到了完全相同的问题,我认为这是根据microsoft documentation处理该问题的正确方法:

DECLARE @Array TABLE(TEST VARCHAR(100));

SELECT
    arr = ISNULL((SELECT TEST FROM @Array FOR JSON PATH), '[]')
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

结果:

{"arr":[]}