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

怎样在SQL Server 2022中用JSON_PATH查询嵌套数组

冬芳大大_4368

冬芳大大_4368

发布时间:2026-09-18 07:17:36

|

517人浏览过

|

来源于php中文网

原创

SQL Server 2022 中 JSON_PATH_EXISTS 不支持带过滤器的路径(如 $?(@.grade>5)),仅支持基础路径;需用 OPENJSON 展开嵌套数组并配合 WHERE 筛选,多层嵌套须逐级调用 OPENJSON。

怎样在sql server 2022中用json_path查询嵌套数组

JSON_PATH_EXISTS 不能直接查嵌套数组元素值

SQL Server 2022 的 JSON_PATH_EXISTS 只返回布尔值(1 或 0),不提取内容。想查“某个嵌套数组里是否存在满足条件的元素”,得用 OPENJSON 配合 WHERE,而不是依赖路径函数本身返回数据。

常见错误现象:SELECT JSON_PATH_EXISTS(doc, '$.children[?(@.grade > 5)]') 看似合理,但该函数在 2022 中不支持带过滤器的 SQL/JSON 路径(如 [?(@.grade > 5)]),会报错 Invalid JSON path expression —— 这个语法是 SQL Server 2025 预览版才支持的。

  • 2022 中能用的路径仅限基础结构:如 $.children[0].grade$.children[1].pets[0].givenName
  • 带过滤器的路径([?(@.xxx)])或通配符([*])在 2022 中无效,强行使用会触发解析失败
  • 若需条件匹配,必须先用 OPENJSON 展开数组,再用 T-SQL 过滤

用 OPENJSON 展开 children 数组并关联父级字段

处理类似 {"children": [{"givenName":"Jesse","grade":1}, {"givenName":"Lisa","grade":8}]} 这类结构时,不能只靠 JSON_VALUE 提取单个位置的值;必须把数组“摊平”成行集才能做条件筛选或聚合。

实操要点:

  • 第一层 OPENJSON(@json, '$.children') 返回每个 child 为一行,key 是索引,value 是子对象 JSON 字符串
  • value 再套一层 OPENJSON,就能提取 givenNamegrade 等字段
  • 外层查询需用 WITH 显式定义列名和类型,否则所有字段都是 nvarchar(max)
  • 别漏掉 AS json 别名,否则第二层 OPENJSON 无法引用上层展开结果

示例:

DECLARE @json NVARCHAR(MAX) = N'{
  "id": "DesaiFamily",
  "children": [
    {"givenName": "Jesse", "grade": 1, "gender": "female"},
    {"givenName": "Lisa", "grade": 8, "gender": "female"}
  ]
}';
<p>SELECT 
f.id,
c.givenName,
c.grade
FROM OPENJSON(@json) WITH (
id NVARCHAR(100) '$.id',
children NVARCHAR(MAX) AS JSON
) AS f
CROSS APPLY OPENJSON(f.children) 
WITH (
givenName NVARCHAR(50) '$.givenName',
grade INT '$.grade',
gender NVARCHAR(10) '$.gender'
) AS c
WHERE c.grade > 5;

处理多层嵌套(如 children → pets)必须嵌套 OPENJSON

当 JSON 中存在“数组套数组”结构(如每个 child 有多个 pets),不能用单层路径如 $.children[0].pets[0].givenName 批量提取——那只能取固定下标,无法泛化。

抖音下载器(Node.js)
抖音下载器(Node.js)

抖音无水印视频下载和文案提取工具

下载

正确做法是逐级展开:

  • 先用 OPENJSON 展开 children 数组,得到 child 行集
  • 对每一行的 pets 字段(本身是 JSON 数组字符串),再调一次 OPENJSON
  • 第二层 WITH 中定义 pet_name NVARCHAR(50) '$.givenName',即可拿到每只宠物名
  • 若某 child 没有 pets 字段或值为 nullCROSS APPLY 会跳过该 child;要用 OUTER APPLY 保留空 pets 的记录

关键细节:第二层 OPENJSON 的输入必须是字符串类型(NVARCHAR),所以第一层 WITHpets 列必须声明为 AS JSONNVARCHAR(MAX),不能写成 JSON 类型(SQL Server 2022 不支持原生 json 类型)。

性能与可读性平衡:避免三层以上 OPENJSON 嵌套

展开深度超过两层(如 family → children → pets → toys)会让 SQL 变得难维护,且执行计划中嵌套循环增多,影响性能。

更可控的做法:

  • 把中间层结果存入临时表(#children),加索引后供后续 JOIN 使用
  • JSON_QUERY 提前截取子结构(如 JSON_QUERY(doc, '$.children')),再对临时字段展开,减少重复解析
  • 确认业务是否真需要全部嵌套数据:有时只需统计 pets 数量,用 LEN(children) - LEN(REPLACE(children, '"givenName"', '')) 这类字符串技巧反而更快(但不可靠,仅作备选)
  • 2022 中没有 JSON_CONTAINS 对数组元素的高效判断,所以不要试图用它替代展开逻辑

最易被忽略的一点:所有 OPENJSON 调用都依赖输入字符串是合法 JSON,务必在上游用 ISJSON() 校验,否则遇到格式错误数据会直接中断整个查询。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

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

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

豆包大模型

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

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

DeepSeek

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

相关专题

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

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

1955

2023.08.07

json是什么
json是什么

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

2582

2023.08.23

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

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

896

2023.10.13

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

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

2879

2025.09.10

sqlserver和mysql区别
sqlserver和mysql区别

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

4331

2023.08.11

Vibeknow在线使用入口合集
Vibeknow在线使用入口合集

本专题汇总了Vibeknow在线创作视频的官方入口及网页版使用教程,涵盖PPT、PDF、Word等文档一键转讲解视频的核心操作,并整理了免费版水印规则与手机端浏览器访问指南,助你快速将知识内容视频化。

20

2026.09.21

NumPy随机数文件读写与dtype数据类型
NumPy随机数文件读写与dtype数据类型

本专题整理 NumPy 随机数、文件读写与 dtype 数据类型相关教程,覆盖 Generator/random、随机数种子、正态分布采样、npy/npz/CSV/TXT 保存读取、loadtxt/savetxt、memmap、大文件处理、astype 类型转换、结构化 dtype、整数溢出和精度丢失等场景。

0

2026.09.21

NumPy矩阵运算与线性代数计算
NumPy矩阵运算与线性代数计算

本专题整理 NumPy 矩阵运算与线性代数计算相关教程,覆盖矩阵乘法、dot 与 @ 运算符、逆矩阵、行列式、特征值与特征向量、SVD、线性方程组、欧氏距离、矩阵分解和大规模矩阵性能优化等内容,帮助读者掌握 np.linalg 与矩阵计算实战。

0

2026.09.21

NumPy广播机制数学运算与统计分析
NumPy广播机制数学运算与统计分析

本专题整理 NumPy 广播机制、数组数学运算与统计分析相关教程,覆盖广播规则、维度对齐、矩阵与数组加减除法、向量化计算、均值方差、分位数、中位数、直方图和 unique 频次统计等场景,帮助读者掌握 ndarray 高效计算与统计处理方法。

0

2026.09.21

热门下载

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

精品课程

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

共101课时 | 20.4万人学习

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

共39课时 | 4.7万人学习

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

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