You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Json_Query等SQL函数提取非空EmployeePictureId并生成JSON数组?

如何从嵌套JSON中提取非空EmployeePictureId并生成指定格式的JSON结果

当然可以!我们可以通过组合使用OPENJSON、STRING_AGG和JSON_QUERY这些SQL Server的JSON函数来实现你想要的结果。下面是具体的实现代码和步骤说明:

首先,先还原你的测试数据:

declare @json nvarchar(max) 
set @json = N' { "Companies": [ { "CompanyId": "A", "Employee": null }, { "CompanyId": "B", "Employee": [ { "EmployeePictureId": null, "Name": "Employee1" }, { "EmployeePictureId": "PictureId2", "Name": "Employee2" } ] }, { "CompanyId": "C", "Employee": [ { "EmployeePictureId": null, "Name": "Employee3" }, { "EmployeePictureId": null, "Name": "Employee4" } ] } ] } '

接下来是实现需求的核心代码:

SELECT 
  JSON_QUERY('{"EmployeePictureIds": [' + STRING_AGG('"' + STRING_ESCAPE(EmployeePictureId, 'json') + '"', ',') + ']}') AS Result
FROM 
  OPENJSON(@json, '$.Companies')
  CROSS APPLY OPENJSON(value, '$.Employee')
WHERE 
  EmployeePictureId IS NOT NULL

代码说明:

  • OPENJSON(@json, '$.Companies'):先解析外层的Companies数组,将每个公司的JSON对象拆分成单独的行。
  • CROSS APPLY OPENJSON(value, '$.Employee'):针对每个公司的Employee数组进行解析(如果Employee为null,比如公司A,这一步会自动忽略,不会产生行)。
  • WHERE EmployeePictureId IS NOT NULL:过滤掉EmployeePictureId为空的记录,只保留非空的ID。
  • STRING_AGG('"' + STRING_ESCAPE(EmployeePictureId, 'json') + '"', ','):把符合条件的EmployeePictureId转换成JSON格式的字符串(带双引号),并用逗号拼接成数组元素的形式。STRING_ESCAPE函数是为了处理ID中可能包含的特殊字符(比如引号、斜杠),确保生成合法的JSON。
  • JSON_QUERY(...):将拼接好的字符串包装成完整的JSON对象,确保返回的结果是合法的JSON类型,而非普通字符串。

执行这段代码后,你会得到想要的结果:

{ "EmployeePictureIds": ["PictureId2"] }

内容的提问来源于stack exchange,提问作者Max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:15:05