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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:19:52