【问题标题】:Include null value for parent attributes in json Response if all child values are null如果所有子值都为空,则在 json 响应中包含父属性的空值
【发布时间】:2021-09-28 14:33:41
【问题描述】:

我正在尝试从查询中生成 json 响应,输出如下所示。

{
 "id": "1",
 "PassStatus": "FAILED",
 "Details": {
    "Id": null,
    "Name": null,
    "Type": null,
    "Location": null
  }
}

我想要如下所示的 json 响应。如果我所有的子属性都为空,那么我需要将父属性的值设置为null

{
 "id": "1",
 "PassStatus": "FAILED",
 "Details": null
}

我正在使用以下查询。如何更改此查询以获得所需的结果。非常感谢任何建议或意见。

select * 
from Table
for json auto,INCLUDE_NULL_VALUES,WITHOUT_ARRAY_WRAPPER

【问题讨论】:

  • 您确定该声明吗?我不认为 JSON 输出来自这个语句。
  • 您能告诉我们您正在使用的表格的列吗?
  • @Zhorov - 更新了我的帖子。

标签: sql arrays json sql-server


【解决方案1】:

如前所述,您拥有的 SQL 不会生成上述 JSON。但是做几个猜测,你可以使用一个子查询:

CREATE TABLE dbo.SomeTable (ID int,
                            PassStatus varchar(10))
CREATE TABLe dbo.OtherTable (ID INT,
                             fID int,
                             [Name] varchar(10),
                             [Type] int,
                             Location varchar(10));
GO
INSERT INTO dbo.SomeTable
VALUES(1,'FAILED'),
      (2,'PASSED');
INSERT INTO dbo.OtherTable (ID,fID,Name)
VALUES(1,2,'Jane')
GO

SELECT ST.ID,
       ST.PassStatus,
       (SELECT OT.ID,
               OT.Name,
               OT.[Type],
               OT.Location
        FROM dbo.OtherTable OT
        WHERE OT.fID = ST.ID
        FOR JSON PATH,INCLUDE_NULL_VALUES) AS Details
FROM dbo.SomeTable ST
WHERE ID = 1
FOR JSON AUTO,INCLUDE_NULL_VALUES,WITHOUT_ARRAY_WRAPPER;
GO
SELECT ST.ID,
       ST.PassStatus,
       (SELECT OT.ID,
               OT.Name,
               OT.[Type],
               OT.Location
        FROM dbo.OtherTable OT
        WHERE OT.fID = ST.ID
        FOR JSON PATH,INCLUDE_NULL_VALUES) AS Details
FROM dbo.SomeTable ST
WHERE ID = 2
FOR JSON PATH,INCLUDE_NULL_VALUES,WITHOUT_ARRAY_WRAPPER;
GO

DROP TABLE dbo.SomeTable;
DROP TABLE dbo.OtherTable;

db<>fiddle

注意子查询需要数组包装器,否则双引号会被转义。

【讨论】:

  • 我不明白为什么你需要在这里双嵌套,details 不需要是一个数组,所以你可以指定路径。此外,为了防止转义,您可以使用 JSON_QUERY
【解决方案2】:

鉴于detail 不是数组,您实际上不需要双重嵌套FOR JSON,您只需为每个属性指定路径即可。

基于@Larnu 的架构:

SELECT ST.ID id,
       ST.PassStatus,
       OT.ID [Details.Id],
       OT.Name [Details.Name],
       OT.[Type] [Details.Type],
       OT.Location [Details.Location]
FROM dbo.SomeTable ST
JOIN dbo.OtherTable OT ON OT.fID = ST.ID
WHERE ST.ID = 2
FOR JSON PATH,INCLUDE_NULL_VALUES,WITHOUT_ARRAY_WRAPPER;

db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2016-05-15
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    相关资源
    最近更新 更多