在SQL Server中解析嵌套JSON列并拼接text值求助
解决SQL Server嵌套JSON多"text"键值拼接问题
原代码问题分析
你写的$.content.content.text路径无效,原因有两点:
$.content是数组类型,不能直接通过.访问内部属性,必须先展开数组元素;- 你的JSON存在多层嵌套(比如
bulletList→listItem→paragraph→content→text),固定层级的路径无法覆盖所有嵌套的text键。
解决方案
方法1:递归路径提取所有text值(推荐)
利用JSON路径的..通配符递归查找所有嵌套的text键,再用STRING_AGG拼接成单个单元格:
SELECT t.ID, t.[Key], STRING_AGG(j.text_value, ' ') AS CombinedTexts FROM TEST_Table t -- 递归提取所有content下的text键值 CROSS APPLY OPENJSON(t.Description, '$.content..text') WITH ( text_value VARCHAR(MAX) '$' ) AS j GROUP BY t.ID, t.[Key];
这个方法无需关心text的嵌套层级,会自动匹配所有位置的text键,适合结构复杂的JSON。
方法2:逐层展开数组(适合结构固定的场景)
如果JSON结构固定,可逐层展开数组提取text:
SELECT t.ID, t.[Key], STRING_AGG(j.text_value, ' ') AS CombinedTexts FROM TEST_Table t -- 展开第一层content数组(paragraph、bulletList等元素) CROSS APPLY OPENJSON(t.Description, '$.content') AS level1 -- 展开每个level1元素内部的content数组 CROSS APPLY OPENJSON(level1.value, '$.content') AS level2 -- 展开level2元素内部的内容,提取text值(过滤无text的元素) CROSS APPLY OPENJSON(level2.value) WITH ( text_value VARCHAR(MAX) '$.text' ) AS j WHERE j.text_value IS NOT NULL GROUP BY t.ID, t.[Key];
两种方法都能将所有text值拼接为单个字符串,根据你的JSON结构复杂度选择即可。
内容的提问来源于stack exchange,提问作者user391014
相关产品推荐
相关产品推荐

