MsSql

关注公众号 jb51net

关闭
首页 > 数据库 > MsSql > sql openjson解析json

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

作者:Tdm_888

文章介绍SQL Server中OPENJSON函数,通过WITH子句将JSON解析为关系型数据表,支持对象、数组及嵌套结构处理,结合CROSS APPLY实现多层展开,适用于JSON数据到表格的转换,感兴趣的朋友跟随小编一起看看吧

一、概念

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文