it编程 > 编程语言 > Javascript

SQL Server中OPENJSON + WITH 解析JSON数据的示例

25人参与 2025-08-18 Javascript

一、概念

openjson 是 sql server(2016 及更高版本) 中引入的一个表值函数,它将 json 文本转换为行和列的关系型数据结构。通过添加 with 子句,可以明确指定返回数据的结构和类型,实现 json 数据到表格数据的精确映射。

二、语法

select column_list
from openjson(json_expression)
with (
column1 data_type '$.path1',
column2 data_type '$.path2',
...
);

说明:

这样,openjson 会把解析的结果返回为一张虚拟表,通过 select 语句可以直接查询。

三、使用示例

示例1:解析简单的 json 对象

declare @json nvarchar(max) = n'{"id": 1, "name": "张三", "age": 30, "isactive": true}';
select *
from openjson(@json)
with (
    id int '$.id',
    name nvarchar(50) '$.name',
    age int '$.age',
    isactive bit '$.isactive'
);

示例2:处理 json 数组

关键点:

declare @json nvarchar(max) = n'[
    {"id": 1, "name": "张三", "skills": ["sql", "c#", "python"]},
    {"id": 2, "name": "李四", "skills": ["java", "javascript"]}
]';
select id, name, skills
from openjson(@json)
with (
    id int '$.id',
    name nvarchar(50) '$.name',
    skills nvarchar(max) '$.skills' as json
);

输出结果

这个查询从json数组中提取基本信息并保留skills数组为json格式:

idnameskills
1张三["sql", "c#", "python"]
2李四["java", "javascript"]
--处理用户及其标签的 json 数组
declare @json nvarchar(max) = n'[
    {"userid": 1, "username": "user1", "tags": ["前端", "javascript", "react"]},
    {"userid": 2, "username": "user2", "tags": ["后端", "python", "django"]},
    {"userid": 3, "username": "user3", "tags": ["全栈", "javascript", "node.js", "mongodb"]}
]';
-- 提取用户基本信息(保留标签数组为 json)
select userid, username, tags
from openjson(@json)
with (
    userid int '$.userid',
    username nvarchar(50) '$.username',
    tags nvarchar(max) '$.tags' as json
) as users;
-- 展开每个用户的标签到单独的行(一对多关系)
select 
    u.userid,
    u.username,
    json_value(t.value, '$') as tag
from openjson(@json)
with (
    userid int '$.userid',
    username nvarchar(50) '$.username',
    tags nvarchar(max) '$.tags' as json
) as u
cross apply openjson(u.tags) as t;

第一部分输出结果

这个查询提取用户基本信息,保留标签数组为json格式:

useridusernametags
1user1["前端", "javascript", "react"]
2user2["后端", "python", "django"]
3user3["全栈", "javascript", "node.js", "mongodb"]

第二部分输出结果

这个查询使用cross apply展开每个用户的标签到单独的行,实现了一对多的关系展示:

useridusernametag
1user1前端
1user1javascript
1user1react
2user2后端
2user2python
2user2django
3user3全栈
3user3javascript
3user3node.js
3user3mongodb

示例3:处理嵌套的 json 对象

这个例子展示了 sql server 中 json 路径表达式的使用,特别是 $.path 格式如何从根($)开始导航嵌套的 json 结构。

重要概念解释

declare @json nvarchar(max) = n'{
    "employee": {
        "id": 101,
        "name": "王五",
        "contact": {
            "email": "wangwu@example.com",
            "phone": "13800138000"
        }
    }
}';
select id, name, email, phone
from openjson(@json, '$.employee')
with (
    id int '$.id',
    name nvarchar(50) '$.name',
    email nvarchar(100) '$.contact.email',
    phone nvarchar(20) '$.contact.phone'
);

在这个示例中:

  1. openjson 的第二个参数 '$.employee'
    • $ 表示整个 json 文档的根
    • .employee 表示从根访问名为 "employee" 的对象
    • 这个参数将查询的上下文(或"基准点")设置为 employee 对象内部
  2. with 子句中的路径
    • '$.id''$.name' 从 employee 对象(当前上下文)直接访问属性
    • '$.contact.email''$.contact.phone' 表示从当前上下文(employee 对象)开始,先访问 contact 对象,然后获取其中的 email 或 phone 属性

到此这篇关于sql server中openjson + with 来解析json的文章就介绍到这了,更多相关sql openjson解析json内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

JSON反序列化中的字段命名冲突问题的解决方案解析

08-12

MySQL JSON类型字段的简单使用

08-06

利用Pandas进行条件替换与向前填充的代码实现

07-31

Nginx优化和模块解读

07-24

MySQL中JSON 函数的具体使用

07-24

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

07-23

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论