如何用T-SQL查询获取SQL Server中JSON的第5个键值对?
解决SQL Server中提取JSON对象指定位置键值对的问题
首先要明确:你的Desc是JSON对象(键值对集合),而非JSON数组,所以$.Desc[5]这种数组索引写法完全无效——数组用[]访问,对象需要通过键名或先转换为可按索引访问的结构。
关键说明:JSON对象的键值对是无序的
JSON标准规定对象的键值对没有固定顺序,SQL Server的OPENJSON解析对象时,默认会按键的Unicode编码升序返回结果,而非原始JSON中的输入顺序。如果需求是严格依赖原始JSON的输入顺序,需要额外处理(见方案二);如果接受按键排序后的顺序,用方案一即可。
方案一:按键排序顺序提取第5个键值对
使用OPENJSON解析Desc对象,给每个键值对编号后筛选第5项,再拼接成目标格式:
SELECT CONCAT('"', [key], '": "', [value], '"') AS result FROM ( SELECT [key], [value], ROW_NUMBER() OVER (ORDER BY [key]) AS rn FROM table_name CROSS APPLY OPENJSON(column_value, '$.Desc') ) AS ranked WHERE rn = 5;
方案二:严格按原始JSON输入顺序提取第5个键值对
如果必须保留原始JSON的输入顺序,需要先将Desc对象转换为JSON数组(把每个键值对包装成独立对象),再按数组索引访问(数组索引从0开始,第5个对应索引4):
SELECT JSON_QUERY( JSON_MODIFY( '[]', 'append $', JSON_QUERY(column_value, '$.Desc') ), '$[4]' ) AS result FROM table_name;
原有语句无效的原因
JSON_QUERY和JSON_VALUE的$.Desc[5]路径错误:Desc是对象而非数组,无法通过数字索引直接访问。- 只有JSON数组(用
[]包裹的结构)才能使用[索引]方式访问元素。
内容的提问来源于stack exchange,提问作者synccm2012
相关产品推荐
相关产品推荐

