如何返回一个JSON_QUERY,如果子查询(或左连接)中选择的值为空,则返回NULL(或根本没有属性)?
这里有一个简单的示例(假设下面的NULL是一个子查询):
SELECT
JSON_QUERY((SELECT NULL as SomeColumn
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)) AS Test
这将返回一个空的JSON对象 - 这不是我想要的:
Test
----------------
{}
由于子查询返回了 NULL,因此我希望如果子查询返回 NULL,它也能返回 NULL,否则应该返回 JSON。
即:
当子查询返回 NULL 时,JSON 结果应为:
Test
----------------
NULL
当子查询返回JSON时,JSON结果应为:
Test
----------------
{ someColumn: 'some json' ... }
如何使用JSON查询来完成这个任务?
[编辑]
我尝试了这个,认为我可以使用CASE语句:
SELECT
JSON_QUERY((SELECT JSON_VALUE('{"SomeColumn":"Test"}', '$') AS SomeColumn
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)) AS Test
但是这不会选择根元素。上面的代码返回:
Test
------
{}
使用案例
我需要的使用案例是这样的。
当我返回JSON查询时,如果地址存在,我希望能够返回以下内容:
{
name: 'John',
address: {
line1: '123 elm st'
}
}
如果没有地址记录,我希望它返回:
{
name: 'John',
address: NULL
}
或者
{
name: 'John'
}
我不希望它返回
{
name: 'John',
address: {}
}
JSON_QUERY()
返回一个nvarchar(max)
作为结果。没有特殊的JSON
数据类型。所有的 JSON 内容都表示为文本。但是你的用例很有趣。我仍然认为,使用OPENJSON()
作为检查条件来检查“空”JSON(数组或对象)是一个不错的选择。但是当这个“空”的 JSON 是更复杂的 JSON 中的嵌套元素时,你需要再次解析整个 JSON。说实话,使用REPLACE(Json, '{}', 'null')
的基于字符串的方法也是一种选择。 - Zhorov