达梦数据库对json字段进行操作

发布于:2025-05-20 ⋅ 阅读:(22) ⋅ 点赞:(0)

在达梦数据库中,字段类型不能显式定义为JSON,通常以VARCHAR或TEXT类型存储JSON字符串,可以通过内置的JSON函数对JSON格式数据进行操作和条件过滤。


1. 创建表并插入JSON数据
假设字段类型为VARCHAR,存储JSON字符串:

-- 创建表(字段为VARCHAR类型)
CREATE TABLE user_data (
    id INT PRIMARY KEY,
    user_info VARCHAR(2000) CHECK (user_info IS JSON)  -- 添加JSON格式校验约束
);

-- 插入JSON数据
INSERT INTO user_data VALUES 
(1, '{"name": "张三", "age": 25, "address": {"city": "北京", "district": "海淀区"}}'),
(2, '{"name": "李四", "age": 30, "address": {"city": "上海", "district": "浦东新区"}}');

2. 查询JSON字段并条件过滤
场景1:提取单个属性值
查询所有用户姓名,并筛选年龄大于28岁的记录:

SELECT 
    id,
    JSON_VALUE(user_info, '$.name') AS name,
    JSON_VALUE(user_info, '$.age') AS age 
FROM user_data 
WHERE CAST(JSON_VALUE(user_info, '$.age') AS INT) > 28;  -- 需将字符串转换为数值比较

场景2:嵌套对象查询
查询用户所在城市为“上海”的记录:

SELECT 
    id,
    JSON_VALUE(user_info, '$.address.city') AS city 
FROM user_data 
WHERE JSON_VALUE(user_info, '$.address.city') = '上海'; 

场景3:使用JSON_QUERY查询复杂结构
提取完整的地址对象(返回JSON片段):

SELECT 
    id,
    JSON_QUERY(user_info, '$.address') AS address 
FROM user_data;

3. 更新JSON字段
场景1:修改属性值
将ID为1的用户年龄改为30:

UPDATE user_data 
SET user_info = JSON_MODIFY(user_info, '$.age', 30)  -- 直接修改JSON字符串中的值
WHERE id = 1;

场景2:删除属性
删除用户的district字段:

UPDATE user_data 
SET user_info = JSON_MODIFY(user_info, 'delete $.address.district', NULL) 
WHERE id = 2;

4. 处理数组类型
若JSON中包含数组(如hobbies: ["阅读", "跑步"]):

-- 查询第一个爱好
SELECT 
    JSON_VALUE(user_info, '$.hobbies[0]') AS hobby 
FROM user_data;

-- 筛选包含“阅读”爱好的用户
SELECT *
FROM user_data 
WHERE JSON_VALUE(user_info, '$.hobbies[0]') = '阅读';

5. 特殊处理:去除引号比较
当JSON值的类型为字符串时,需用JSON_UNQUOTE去除引号:

SELECT *
FROM user_data 
WHERE JSON_UNQUOTE(JSON_EXTRACT(user_info, '$.name')) LIKE '%张%';

注意事项: 路径表达式:达梦使用$表示根节点,如$.name$.address.city


网站公告

今日签到

点亮在社区的每一天
去签到