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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:43:01