1

我有这样的数据表

Id  |  Name   | Phone  | OtherField 
----+---------+--------+-----------
 1  | ABC     | 12344  | NULL
 2  | XYZ     | NULL   | NULL

我想要一个 SQL 查询来像这样转换它

[
    {
      "ID":1,
      "Name":"ABC",
      "Phone":[
               {"Home":"12344"}
             ],
       "OtherFields":NULL
     },
    {
     "ID":1,
     "Name":"ABC",
     "OtherFields":NULL
    }
]

我知道INCLUDE_NULL_VALUES它包括所有空白字段。我想包括除电话以外的所有其他字段。

4

2 回答 2

0

我已经编辑了我的答案,因为您更改了原始请求。

我不相信你可以同时拥有它,保留一些 NULL 而不是其他的。目前我能想到的最好方法是在ISNULL必须保留的列上使用。

例如:

DECLARE @Table TABLE ( Id INT, Name VARCHAR(10), Phone VARCHAR(10), OtherField VARCHAR(10) );
INSERT INTO @Table ( Id, Name, Phone ) VALUES
    ( 1, 'ABC', '12344' ), ( 2, 'XYZ', NULL );

SELECT 
    Id, Name, 
    JSON_QUERY ( CASE
        WHEN t.Phone IS NOT NULL THEN x.Phone
        ELSE NULL
    END ) AS Phone,
    ISNULL( OtherField, '' ) AS OtherFields
FROM @Table t
CROSS APPLY (
    SELECT ( SELECT Phone AS Home FOR JSON PATH ) AS Phone
) x
    FOR JSON PATH;

退货

[{
    "Id": 1,
    "Name": "ABC",
    "Phone": [{
        "Home": "12344"
    }],
    "OtherFields": ""
}, {
    "Id": 2,
    "Name": "XYZ",
    "OtherFields": ""
}]
于 2020-10-01T20:40:03.700 回答
0

更新:

原始问题已被编辑,我认为您不能使用单个FOR JSONand生成预期的输出INCLUDE_NULL_VALUES,因为现在该表有多个包含NULL值的列(OtherField在示例中)。

作为一种可能的解决方案,您可以尝试混合方法(使用FOR JSONand STRING_AGG())来构建最终的 JSON 输出并保留NULL所有列的值,除了Phones

CREATE TABLE Data (
   Id int, 
   Name varchar(100), 
   Phone varchar(100),
   OtherField varchar(1)
);
INSERT INTO Data (Id, Name, Phone, OtherField) 
VALUES
    (1, 'ABC', '12344', NULL), 
    (2, 'ABC', NULL, NULL),
    (3, 'ABC', NULL, NULL)

陈述:

SELECT CONCAT(
   '[',
   (
   SELECT STRING_AGG(j.Json, ',')
   FROM Data d
   CROSS APPLY (
      SELECT CASE
         WHEN Phone IS NOT NULL THEN (
            SELECT Id, Name, (SELECT Phone AS Home FOR JSON PATH) AS Phone, OtherField 
            FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER
         )
         ELSE (
            SELECT Id, Name, OtherField
            FOR JSON PATH, INCLUDE_NULL_VALUES, WITHOUT_ARRAY_WRAPPER
         )
      END
   ) j (Json)
   ),
   ']'
)   

结果:

[
   {"Id":1,"Name":"ABC","Phone":[{"Home":"12344"}],"OtherField":null},
   {"Id":2,"Name":"ABC","OtherField":null},
   {"Id":3,"Name":"ABC","OtherField":null}
]

原答案:

您可以尝试以下语句:

桌子:

CREATE TABLE Data (
   Id int, 
   Name varchar(100), 
   Phone varchar(100) 
);
INSERT INTO Data (Id, Name, Phone) 
VALUES
    (1, 'ABC', '12344'), 
    (2, 'ABC', NULL )

陈述:

SELECT 
   Id, 
   Name, 
   JSON_QUERY(CASE WHEN Phone IS NOT NULL THEN (SELECT Phone AS Home FOR JSON PATH) END) AS Phone
FROM Data
FOR JSON PATH

结果:

[
   {"Id":1,"Name":"ABC","Phone":[{"Home":"12344"}]},
   {"Id":2,"Name":"ABC"}
]
于 2020-10-01T20:50:31.767 回答