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

Sam*_*ami 7 sql-server json sql-server-2016

我正在使用SQL Server 2016,它支持JSON PATH返回JSON字符串。我想知道如何获取一个简单的空json数组,这意味着[]当我的查询或子查询返回null时。我试过这个查询:

SELECT '' AS TEST
FOR JSON PATH,ROOT('arr')
Run Code Online (Sandbox Code Playgroud)

返回:

{"arr":[{"test":""}]}
Run Code Online (Sandbox Code Playgroud)

还有这个:

SELECT NULL AS TEST
FOR JSON PATH,ROOT('arr')
Run Code Online (Sandbox Code Playgroud)

返回:

{"arr":[{}]}
Run Code Online (Sandbox Code Playgroud)

更好,但仍然不正确,我需要这样做:

{"arr":[]}
Run Code Online (Sandbox Code Playgroud)

Jov*_*SFT 5

您始终可以使用ISNULL进行检查,例如:

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

如果需要在应用程序层中使用它,也许最好检查一下数据访问代码中是否设置了一些结果,如果不是,则只返回[]或{}。


N8a*_*lan 5

这可行,并且可以在另一个for json查询中组成:

select json_query('[]') arr 
    for json path, without_array_wrapper
Run Code Online (Sandbox Code Playgroud)


Luk*_*der 5

当嵌套此类子查询时,我发现结合其他人所说的效果最好,即:

  • 用于COALESCE((SELECT .. FOR JSON), '[]')防止null子查询中的值
  • 用于JSON_QUERY()防止转义/引用。

例如:

select
  json_query(coalesce((select 1 as b where 1 = 0 for json path), '[]')) as a
for json path;
Run Code Online (Sandbox Code Playgroud)

生产:

|JSON      |
|----------|
|[{"a":[]}]|
Run Code Online (Sandbox Code Playgroud)

没有JSON_QUERY

现在嵌套的 json 数组被引用:

select
  coalesce((select 1 as b where 1 = 0 for json path), '[]') as a
for json path;
Run Code Online (Sandbox Code Playgroud)

结果是

|JSON        |
|------------|
|[{"a":"[]"}]|
Run Code Online (Sandbox Code Playgroud)

没有COALESCE

现在嵌套的 JSON 是null

select
  json_query((select 1 as b where 1 = 0 for json path)) as a
for json path`;
Run Code Online (Sandbox Code Playgroud)

结果是

|JSON|
|----|
|[{}]|
Run Code Online (Sandbox Code Playgroud)


dfu*_*ako 1

一些手册,但如果您需要快速破解,请看这里:

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


SELECT REPLACE(@json, '{}', '')
Run Code Online (Sandbox Code Playgroud)