讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在SQL Server中使用JSON_VALUE解析复杂JSON结构

大晨姑娘_6208

大晨姑娘_6208

发布时间:2026-10-29 12:18:29

|

576人浏览过

|

来源于php中文网

原创

JSON_VALUE仅提取标量值,嵌套对象或数组返回NULL;路径须严格匹配大小写、点号分隔、数组索引从0开始;应配合TRY_CAST、ISNULL等处理类型与空值,并优先用OPENJSON或计算列优化性能。

如何在sql server中使用json_value解析复杂json结构

JSON_VALUE只能取标量值,嵌套对象或数组一律返回NULL

这不是bug,是设计使然。JSON_VALUE的语义就是“提取一个字符串、数字、布尔或null”,它不处理结构。哪怕你传入'$.address',而address在原始JSON里是个对象(如{"city":"Beijing"}),结果也是NULL。

常见误判场景:

  • 看到JSON里有"items": [{"id": 1}, {"id": 2}],就写JSON_VALUE(data, '$.items') → 返回NULL
  • 路径写成'$.user.profile["name"]'(带方括号)→ SQL Server不支持,静默返回NULL
  • 字段名大小写不一致,比如JSON里是"Name"却查'$.name' → NULL

验证方法:先用JSON_QUERY(data, '$.address')确认该路径确实存在且是对象;若要取其中的city,再换用JSON_VALUE(data, '$.address.city')。

深层嵌套和数组索引必须严格匹配路径语法

SQL Server的JSON路径是大小写敏感、点号分隔、数组索引从0开始的纯文本表达式,不支持通配符或模糊匹配。

以这个JSON为例:

{ "order": { "items": [ { "sku": "A100", "qty": 2 }, { "sku": "B200", "qty": 1 } ] } }

以下操作才有效:

  • JSON_VALUE(doc, '$.order.items[0].sku') → "A100"
  • JSON_VALUE(doc, '$.order.items[1].qty') → "1"(注意返回仍是varchar)
  • JSON_VALUE(doc, '$.order.items[0]') → NULL(因为[0]指向对象,不是标量)
  • JSON_VALUE(doc, '$.Order.items[0].sku') → NULL(Order首字母大写,但原始键是order)

开发阶段建议加ERROR ON ERROR:写成JSON_VALUE(doc, '$.order.items[0].price' ERROR ON ERROR),路径错或字段不存在时直接报错,避免被NULL掩盖问题。

arcgis-js
arcgis-js

提供 ArcGIS Maps SDK for JavaScript 开发辅助,涵盖 2D/3D 地图视图、图层管理、数据可视化、空间分析等功能模块的参考和示例指导。

下载

类型转换和空值传播必须显式处理

JSON_VALUE永远返回varchar(4000),哪怕原始JSON里是123或true。不做转换就参与计算,大概率出错。

典型陷阱:

  • 想把JSON_VALUE(doc, '$.count')当整数用:WHERE JSON_VALUE(doc, '$.count') > 10 → 隐式转换失败,报错
  • 字段可能为空或缺失:JSON_VALUE(doc, '$.status')为NULL,后续ISNULL(..., 'active')没包住,导致整个表达式为NULL
  • 数值精度丢失:JSON里是"price": 199.99,用CAST(... AS int)直接截断成199

安全写法:

  • 数值字段:用TRY_CAST(JSON_VALUE(doc, '$.amount') AS decimal(10,2))
  • 布尔字段:用CASE WHEN JSON_VALUE(doc, '$.is_valid') = 'true' THEN 1 ELSE 0 END
  • 必填字段兜底:ISNULL(NULLIF(RTRIM(JSON_VALUE(doc, '$.code')), ''), 'UNKNOWN')

视图或大表中高频调用JSON_VALUE会显著拖慢查询

每次调用JSON_VALUE都会对同一行的JSON字符串重新解析一次。如果一个视图定义里写了6个JSON_VALUE字段,扫描10万行,等于执行了60万次JSON解析 —— 不是10万次解析复用6次。

优化思路:

  • 优先考虑用OPENJSON一次性展开,尤其当你要取3个以上字段时:CROSS APPLY OPENJSON(doc) WITH (id int '$.id', name nvarchar(50) '$.name', ts datetime2 '$.ts')
  • 对高频查询字段,建计算列并索引:ALTER TABLE Orders ADD status AS JSON_VALUE(doc, '$.status'),再在status上建非聚集索引
  • 避免在WHERE里对JSON_VALUE结果做函数运算,例如UPPER(JSON_VALUE(...)) = 'PAID' → 无法走索引,应提前物化

最易被忽略的一点:ISJSON(doc) = 0的行,JSON_VALUE也返回NULL,但你无法从结果区分是“真没这个字段”还是“整条JSON格式损坏”。生产环境必须前置过滤或打标记。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2195

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3462

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1156

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3999

2025.09.10

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6031

2023.08.11

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

20

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.2万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn