我使用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":[]}
答案 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":[]}