SQL Server解析JSON:按技能拆分生成单条记录问题求助
解决JSON数组展开后技能字段为NULL的问题
你遇到的问题是因为在使用CROSS APPLY OPENJSON处理技能数组时,WITH子句的写法不正确导致的。让我帮你修正这个问题,同时提供两种可行的解决方案:
方案1:直接查询JSON(无需临时表)
如果你不需要把数据存入临时表,可以一步到位得到预期结果:
DECLARE @json nvarchar(1000); SET @json = '{"name":"John","surname":"Doe","age":45,"skills":["SQL","C#","MVC"]}'; SELECT UPPER(JSON_VALUE(@json, '$.name')) AS NAME, UPPER(JSON_VALUE(@json, '$.surname')) AS SURNAME, JSON_VALUE(@json, '$.age') AS AGE, value AS SKILL FROM OPENJSON(@json, '$.skills')
这个写法的逻辑是:
- 用
JSON_VALUE直接从原JSON中提取name、surname和age字段 - 通过
OPENJSON(@json, '$.skills')定位到skills数组,直接读取每个元素的value(也就是技能名称)
方案2:修正你已有的临时表查询
如果你已经把数据存入了student表,只需要修改查询语句即可:
SELECT UPPER(s.name) AS NAME, UPPER(s.surname) AS SURNAME, s.age AS AGE, j.value AS SKILL FROM student s CROSS APPLY OPENJSON(s.skills) AS j
为什么原来的写法会返回NULL?
你之前用了OPENJSON(skills) WITH (skills nvarchar(max)),这个WITH子句是告诉SQL:从每个数组元素中提取名为"skills"的键对应的值。但你的skills数组里都是字符串(比如"SQL"),根本没有"skills"这个键,所以自然返回NULL。而直接取j.value就能拿到数组中每个元素的实际值。
运行以上任意一种方案,都能得到你想要的结果:
NAME SURNAME AGE SKILL JOHN DOE 45 SQL JOHN DOE 45 C# JOHN DOE 45 MVC
内容的提问来源于stack exchange,提问作者Sarvesh Bandekar
相关产品推荐
相关产品推荐

