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

SQL使用多个CROSS APPLY解析JSON字段展开单行数据咨询

问题原因

你写的查询存在两个会导致执行失败的问题:

  • 第一个CROSS APPLY子句末尾多余的分号会截断SQL语句,造成语法错误,后续的第二个CROSS APPLY逻辑无法和前面的查询关联。
  • 你给出的示例line_data字段值存在JSON格式错误:"cost": "0.50"'位置多了一个冗余单引号,合法格式应为[{"products": "apple", "cost": "0.50"}],存储的JSON格式非法时OPENJSON会直接抛出解析错误。
  • 额外注意:不要直接用table作为表名,table是SQL保留关键字,直接使用会触发语法错误。
正确实现方式

如果你的shipping_data和line_data字段存储的都是单元素JSON数组,去掉多余分号即可得到「所有字段展开到同一行」的结果,代码如下:

SELECT t.id, A.*, B.*
FROM your_table t -- 替换为实际业务表名
CROSS APPLY OPENJSON(t.[shipping_data]) 
WITH (
    name nvarchar(max),
    Address nvarchar(max)
) A
CROSS APPLY OPENJSON(t.[line_data])
WITH (
    products nvarchar(max),
    cost nvarchar(max)
) B;

执行后返回的结果列包含id、name、Address、products、cost,所有字段在同一行展示,完全匹配需求。

多元素数组场景适配

如果两个JSON数组中存储了多条记录(比如一条订单对应多个收货地址、多个商品),直接用CROSS APPLY会返回两个数组元素的笛卡尔积(比如2个收货地址+3个商品会返回6行组合结果)。如果业务上两个数组的元素是按顺序一一对应的,可以通过OPENJSON返回的数组下标做关联,避免出现多余的组合行,写法如下:

SELECT t.id, A.name, A.Address, B.products, B.cost
FROM your_table t
CROSS APPLY OPENJSON(t.[shipping_data]) 
WITH (
    name nvarchar(max),
    Address nvarchar(max),
    array_idx int '$' -- 取当前元素的数组下标
) A
CROSS APPLY OPENJSON(t.[line_data])
WITH (
    products nvarchar(max),
    cost nvarchar(max),
    array_idx int '$'
) B
WHERE A.array_idx = B.array_idx; -- 按下标匹配对应记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:42:25