SQLserver如何提取这种json, 嵌套json的字段,而且里面有同名的情况
例如:需要获取planTableList 中的第二个name,如果获取
如果json里的字段需要用于筛选,那你设计表结构的时候就应该单独把它拎出来
不要总企图用sql来干高级语言的事
即使最终能实现,那查询速度也是令人发指的
你没法单独给json里的一个属性加索引
那你就只能先找到planTableList 然后获取后边的name,从第二个开始截取,如果里边只有两个name 那就可以使用RIGHT函数去获取,但是总体来说从麻烦的json中获取指定字段使用sql还是比较麻烦,而且容易出错,可以借助其他后端语言,解析成json对象,再获取属性值
引用ChatGPT部分参考:
可以使用SQL Server自带的OPENJSON函数来解析json数据,具体步骤如下所示:
1、首先使用SELECT语句的OPENJSON函数将json数据解析为表格的形式。
例如,以下代码使用OPENJSON函数将json数据解析为名为jsonTable的表格:
DECLARE @json NVARCHAR(MAX) = '
{
"name":"123",
... 你截图里面的json内容
}
'
SELECT *
FROM OPENJSON(@json) WITH ([planTableList] NVARCHAR(MAX) AS JSON);
在使用WITH子句指定json结构时,使用AS JSON可以方便地将子对象解析为JSON格式的字符串,方便后续处理。
2、使用CROSS APPLY语句将嵌套的json对象解析为表格。
例如,以下代码使用CROSS APPLY函数将planTableList字段中的嵌套的json对象解析为名为planTableListTable的表格:
DECLARE @json NVARCHAR(MAX) = '
{
"name":"123",
... 你截图里面的json内容
},
{
"name":"testName" --需要获取的字段
}
]
}
}
'
SELECT [name]
FROM OPENJSON(@json) WITH (
[evaluation] NVARCHAR(MAX) AS JSON
) CROSS APPLY OPENJSON([evaluation].[planTableList]) WITH (
[name] NVARCHAR(50) '$.name'
);
在使用OPENJSON函数解析时,可以根据具体的json结构使用$或子属性名来获取对应的嵌套字段。由于json中可能存在同名的对象,因此需要使用SQL Server中的别名来进行区分,同时也可以使用JSON_QUERY函数来获取json对象。
在以上示例中,我们使用的是WITH子句来指定列的别名,从而获得planTableList字段中的第二个json对象中的name字段。