SQL Server 中的jsonb_strip_nulls等效项

jsonb_strip_nulls equivalent in SQL Server

提问人:Valeriy K. 提问时间:8/30/2023 最后编辑:marc_sValeriy K. 更新时间:8/30/2023 访问量:69

问:

我正在使用此请求从 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",
    ...
  }
}
json sql-server null

评论

0赞 Zhorov 8/30/2023
该专栏的实际内容是什么,您的 SQL Server 版本是什么?info
0赞 Valeriy K. 8/30/2023
请参阅问题中的更新

答:

2赞 Zhorov 8/30/2023 #1

您可以尝试使用 和 修饰符构建预期的 JSON 内容:FOR JSON PATHWITHOUT_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 PATHFOR 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';