达梦数据库对json字段进行操作
在达梦数据库中,字段类型不能显式定义为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
。