sql - SQL Server FOR JSON PATH,如果为 null,则排除特定字段
问题描述
我有这样的数据表
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
它包括所有空白字段。我想包括除电话以外的所有其他字段。
解决方案
我已经编辑了我的答案,因为您更改了原始请求。
我不相信你可以同时拥有它,保留一些 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": ""
}]
推荐阅读
- php - 如何在 ionic 4 MYSQL & PHP 中将图像上传到数据库?
- python - 无法识别 URL 重定向
- laravel - Nginx 和 Laravel:如何将“位置”块限制为从“/”到“/api”?
- python-3.x - 执行graphviz时调用异常
- javascript - 如何始终在段落末尾放置阅读更多 - 阅读更少按钮?
- ios - UITextView 中的 AttributedString 在顶部被修剪
- python - If.. else:有没有更好的方法来处理这个问题?
- macos - JXA:删除文件夹,创建新文件夹,将匹配的文件移动到新文件夹中
- javascript - 使用 window.open() 打开新选项卡,但 URL 重定向到另一个页面并丢失句柄
- google-app-engine - 谷歌云平台 DNS_PROBE_FINISHED_NXDOMAIN 使用第三方域