【发布时间】:2016-12-18 12:50:09
【问题描述】:
我正在尝试使用 SQL Server 2016 构建一个包含数组的 JSON 对象。
数组的源数据本身就是 JSON,所以我在 select 语句中使用 JSON_QUERY,并将 FOR JSON 子句应用于 select 语句。
在我将 JSON_QUERY 子句包装在 CASE 语句中之前,一切都运行良好(在某些情况下,该数组不得包含在内,即必须为空)。
以下代码说明了问题:
declare @projects nvarchar(max) = '{"projects": [23439658267415,166584258534050]}'
declare @id bigint = 123
SELECT
[data.array1] = JSON_QUERY(@projects, '$.projects') -- returns an array - perfect.
, [data.array2] = CASE WHEN 1 is NOT NULL
THEN JSON_QUERY(@projects, '$.projects')
ELSE NULL END -- returns an array - still good!
, [data.array3] = CASE WHEN @id is NOT NULL
THEN JSON_QUERY(@projects, '$.projects')
ELSE NULL END -- why do I end up with a string in the JSON when I do this?
FOR JSON PATH, without_array_wrapper
此代码返回以下 JSON:
{
"data":{
"array1": [23439658267415,166584258534050],
"array2": [23439658267415,166584258534050],
"array3":"[23439658267415,166584258534050]"
}
}
问题是第三个“数组”作为字符串对象返回。
我希望它返回以下 JSON:
{
"data":{
"array1": [23439658267415,166584258534050],
"array2": [23439658267415,166584258534050],
"array3": [23439658267415,166584258534050]
}
}
如果我删除 FOR JSON PATH... 子句,查询返回的所有列都是相同的(即 JSON_QUERY 函数返回的所有三个 nvarchar 值都是相同的)。
为什么会这样,如何让它在最终的 JSON 中输出一个数组?
【问题讨论】:
-
你的预期输出是什么?
-
感谢@dfundako,我已经编辑了这个问题,以便更容易理解并包含预期的输出。
标签: arrays sql-server json tsql sql-server-2016