提问人:Valeriy K. 提问时间:8/30/2023 最后编辑:marc_sValeriy K. 更新时间:8/30/2023 访问量:69
SQL Server 中的jsonb_strip_nulls等效项
jsonb_strip_nulls equivalent in SQL Server
问:
我正在使用此请求从 POSTGRES 中的一些列中获取 JSON:
SELECT
jsonb_strip_nulls(json_build_object(
'employee', c."info"->'employee2', 'product', c."info"->'product2'
)::jsonb) as info
FROM
item."Item" AS c
WHERE
"rootId" = '40a8cb67-84f8-33b5-87dc-e1b039858d43'
GROUP BY
"id") ...;
jsonb_strip_nulls
省略具有 null 值的不必要字段。我需要在 SQL Server 中执行相同的操作。
我正在使用此请求来检索项目:
SELECT
'{ "employee": ' + JSON_QUERY(info, '$.employee') + ', "product": ' + JSON_QUERY(info, '$.product2') + ' }' AS info
FROM
item.[Item] AS c
WHERE
"rootId" = '3B319A76-A2C7-3DA1-8ECE-4736E4749261'
GROUP BY
"id") ...;
当我尝试获取一些不存在的字段时,我得到了所有字段的空值。但我需要省略 JSON 中不存在的字段。
例如,如果该字段不存在,但“employee”存在,我希望在响应中看到员工。我该怎么做?product2
UPD:SQL Server 版本:
Microsoft Azure SQL Edge Developer (RTM) - 15.0.2000.1552 (ARM64)
信息内容是 json 类型的字段,如下所示:
{
"_key": {
"id": "3b8d1ed7-c3ec-32ec-a083-2ddc17152e94",
"rootId": "15c85327-9628-3685-b84a-375b546ba92a",
},
"employee": {
"idNumber": "3",
"gender": "M",
....
},
"product": {
"plan": "prod",
"class": "1",
"_type": "Product",
...
}
}
答:
2赞
Zhorov
8/30/2023
#1
您可以尝试使用 和 修饰符构建预期的 JSON 内容:FOR JSON PATH
WITHOUT_ARRAY_WRAPPER
SELECT info = (
SELECT
employee = JSON_QUERY(info, '$.employee'),
product = JSON_QUERY(info, '$.product2')
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
)
FROM item
在 Azure 实例上,可以使用 (...我不确定 Microsoft Azure SQL Edge 开发人员是否支持此功能):JSON_OBJECT()
SELECT JSON_OBJECT(
'employee': JSON_QUERY(info, '$.employee'),
'product': JSON_QUERY(info, '$.product2')
ABSENT ON NULL
) AS info
FROM Item
评论
0赞
Charlieface
8/30/2023
如果您有多个字段,也可以使用。OPENJSON
0赞
Zhorov
8/30/2023
@Charlieface,是的,你是对的。这只是一个简化的例子,实际场景可能更复杂。
1赞
Martin Smith
8/30/2023
看起来在 Edge learn.microsoft.com/en-us/azure/azure-sql-edge/ 上“不受支持”......JSON_OBJECT()
0赞
Valeriy K.
8/30/2023
第一个解决方案对我有用。谢谢
1赞
Charlieface
8/30/2023
#2
您可以解析 JSON 并使用子查询内部重新构建它。 默认情况下不提供 NULL 值。FOR JSON PATH
FOR JSON
SELECT
(
SELECT
j.*
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
) AS info
FROM item.Item AS c
CROSS APPLY OPENJSON(c.info)
WITH (
employee nvarchar(max) AS JSON,
product2 nvarchar(max) AS JSON
) j
WHERE rootId = '3B319A76-A2C7-3DA1-8ECE-4736E4749261';
评论
info