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)
您始终可以使用ISNULL进行检查,例如:
select ISNULL( (SELECT * FROM sys.tables where 1=2 FOR JSON PATH), '[]')
Run Code Online (Sandbox Code Playgroud)
如果需要在应用程序层中使用它,也许最好检查一下数据访问代码中是否设置了一些结果,如果不是,则只返回[]或{}。
这可行,并且可以在另一个for json查询中组成:
select json_query('[]') arr
for json path, without_array_wrapper
Run Code Online (Sandbox Code Playgroud)
当嵌套此类子查询时,我发现结合其他人所说的效果最好,即:
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)
一些手册,但如果您需要快速破解,请看这里:
DECLARE @JSON NVARCHAR(MAX) = (SELECT NULL AS test
FOR JSON PATH,ROOT('arr'))
SELECT REPLACE(@json, '{}', '')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4257 次 |
| 最近记录: |