MySQL数据库开发:json_extract()函数的使用方法
MySQL中json_extract()函数的使用
作用:截取数据库中指定字段中存储的json数据中的某个字段对应的值
要做做什么?(根据数据库中相关表字段中存储的json格式的数据,然后以SQL语句的形式取出其中指定key对应的值,最终整理汇总为一张视图供以后的方便使用)
一、初始化
1、初始化表结构
CREATE TABLE `cus_history` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键id’,
`customer_id` bigint(20) NOT NULL COMMENT ‘客户id’,
`name` varchar(20) NOT NULL COMMENT ‘姓名’,
`sex` char(2) DEFAULT NULL COMMENT ‘性别’,
`sex_name` varchar(200) DEFAULT NULL COMMENT ‘性别’,
`birthday` date DEFAULT NULL COMMENT ‘出生日期’,
`birtydaytype` char(2) DEFAULT NULL COMMENT ‘出生日期类型’,
`birtydaytype_name` varchar(200) DEFAULT NULL COMMENT ‘生日类型’,
`age` varchar(20) DEFAULT NULL COMMENT ‘年龄’,
`nation` char(2) DEFAULT NULL COMMENT ‘民族’,
`nation_name` varchar(200) DEFAULT NULL COMMENT ‘民族’,
`religion` char(2) DEFAULT NULL COMMENT ‘宗教’,
`religion_name` varchar(200) DEFAULT NULL COMMENT ‘宗教’,
`phone` varchar(20) DEFAULT NULL COMMENT ‘手机’,
`marriage` char(2) DEFAULT NULL COMMENT ‘婚姻’,
`marriage_name` varchar(200) DEFAULT NULL COMMENT ‘婚姻’,
`service_gradation` char(4) DEFAULT NULL COMMENT ‘服务等级’,
`service_gradation_name` varchar(200) DEFAULT NULL COMMENT ‘服务等级’,
`occupation` char(2) DEFAULT NULL COMMENT ‘职业’,
`occupation_name` varchar(200) DEFAULT NULL COMMENT ‘职业’,
`education` char(2) DEFAULT NULL COMMENT ‘教育程度’,
`education_name` varchar(200) DEFAULT NULL COMMENT ‘学历’,
`blood` char(2) DEFAULT NULL COMMENT ‘血型’,
`blood_name` varchar(200) DEFAULT NULL COMMENT ‘血型’,
`blood_rh` char(2) DEFAULT NULL COMMENT ‘rh血型’,
`blood_rh_name` varchar(200) DEFAULT NULL COMMENT ‘rh血型’,
`kind` char(2) DEFAULT NULL COMMENT ‘顾客类型’,
`kind_name` varchar(200) DEFAULT NULL COMMENT ‘顾客类型’,
`gradation` char(2) DEFAULT NULL COMMENT ‘顾客级别’,
`gradation_name` varchar(200) DEFAULT NULL COMMENT ‘顾客级别’,
`register_addr` varchar(200) DEFAULT NULL COMMENT ‘户口地址’,
`contact_addr` varchar(200) DEFAULT NULL COMMENT ‘联系地址’,
`address_backup` text COMMENT ‘地址归档’,
`relations_backup` text COMMENT ‘联系人归档’,
`allowancetype_backup` text COMMENT ‘津贴归档’,
`medicaltype_backup` text COMMENT ‘医保类型归档’,
`deformitytype_backup_json` json DEFAULT NULL,
`deformitytype_backup` text COMMENT ‘残疾类型归档’,
`history_disease_backup_json` json DEFAULT NULL,
`history_disease_backup` text COMMENT ‘疾病史归档’,
`history_drug_backup_json` json DEFAULT NULL,
`history_drug_backup` text COMMENT ‘用药史归档’,
`history_allergy_backup` text COMMENT ‘过敏史归档’,
`history_operation_backup` text COMMENT ‘手术史归档’,
`history_bloodtrans_backup` text COMMENT ‘输血史归档’,
`history_injury_backup` text COMMENT ‘外伤史归档’,
`history_familydisease_backup` text COMMENT ‘家族疾病史归档’,
`history_geneticdisease_backup` text COMMENT ‘遗传史归档’,
`isvalid` char(1) NOT NULL DEFAULT ‘1’ COMMENT ‘是否可用’,
`sts` char(1) NOT NULL DEFAULT ‘1’ COMMENT ‘是否删除’,
`create_id` bigint(20) DEFAULT NULL COMMENT ‘创建人’,
`create_time` datetime DEFAULT NULL COMMENT ‘创建时间’,
`modify_id` bigint(20) DEFAULT NULL COMMENT ‘修改人’,
`modify_time` datetime DEFAULT NULL COMMENT ‘修改时间’,
`remark` varchar(200) DEFAULT NULL COMMENT ‘备注’,
`height` varchar(20) DEFAULT NULL COMMENT ‘身高’,
`weight` varchar(20) DEFAULT NULL COMMENT ‘体重’,
`identity` varchar(50) DEFAULT NULL COMMENT ‘身份证号’,
`telephone` varchar(50) DEFAULT NULL COMMENT ‘固定电话’,
`service_id` bigint(20) DEFAULT NULL COMMENT ‘服务order_id’,
`china_birthday` varchar(50) DEFAULT NULL COMMENT ‘农历生日’,
`user_service_id` bigint(20) DEFAULT NULL COMMENT ‘服务id’,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3835 DEFAULT CHARSET=utf8 COMMENT=’客户历史档案’;
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键id’,
`customer_id` bigint(20) NOT NULL COMMENT ‘客户id’,
`name` varchar(20) NOT NULL COMMENT ‘姓名’,
`sex` char(2) DEFAULT NULL COMMENT ‘性别’,
`sex_name` varchar(200) DEFAULT NULL COMMENT ‘性别’,
`birthday` date DEFAULT NULL COMMENT ‘出生日期’,
`birtydaytype` char(2) DEFAULT NULL COMMENT ‘出生日期类型’,
`birtydaytype_name` varchar(200) DEFAULT NULL COMMENT ‘生日类型’,
`age` varchar(20) DEFAULT NULL COMMENT ‘年龄’,
`nation` char(2) DEFAULT NULL COMMENT ‘民族’,
`nation_name` varchar(200) DEFAULT NULL COMMENT ‘民族’,
`religion` char(2) DEFAULT NULL COMMENT ‘宗教’,
`religion_name` varchar(200) DEFAULT NULL COMMENT ‘宗教’,
`phone` varchar(20) DEFAULT NULL COMMENT ‘手机’,
`marriage` char(2) DEFAULT NULL COMMENT ‘婚姻’,
`marriage_name` varchar(200) DEFAULT NULL COMMENT ‘婚姻’,
`service_gradation` char(4) DEFAULT NULL COMMENT ‘服务等级’,
`service_gradation_name` varchar(200) DEFAULT NULL COMMENT ‘服务等级’,
`occupation` char(2) DEFAULT NULL COMMENT ‘职业’,
`occupation_name` varchar(200) DEFAULT NULL COMMENT ‘职业’,
`education` char(2) DEFAULT NULL COMMENT ‘教育程度’,
`education_name` varchar(200) DEFAULT NULL COMMENT ‘学历’,
`blood` char(2) DEFAULT NULL COMMENT ‘血型’,
`blood_name` varchar(200) DEFAULT NULL COMMENT ‘血型’,
`blood_rh` char(2) DEFAULT NULL COMMENT ‘rh血型’,
`blood_rh_name` varchar(200) DEFAULT NULL COMMENT ‘rh血型’,
`kind` char(2) DEFAULT NULL COMMENT ‘顾客类型’,
`kind_name` varchar(200) DEFAULT NULL COMMENT ‘顾客类型’,
`gradation` char(2) DEFAULT NULL COMMENT ‘顾客级别’,
`gradation_name` varchar(200) DEFAULT NULL COMMENT ‘顾客级别’,
`register_addr` varchar(200) DEFAULT NULL COMMENT ‘户口地址’,
`contact_addr` varchar(200) DEFAULT NULL COMMENT ‘联系地址’,
`address_backup` text COMMENT ‘地址归档’,
`relations_backup` text COMMENT ‘联系人归档’,
`allowancetype_backup` text COMMENT ‘津贴归档’,
`medicaltype_backup` text COMMENT ‘医保类型归档’,
`deformitytype_backup_json` json DEFAULT NULL,
`deformitytype_backup` text COMMENT ‘残疾类型归档’,
`history_disease_backup_json` json DEFAULT NULL,
`history_disease_backup` text COMMENT ‘疾病史归档’,
`history_drug_backup_json` json DEFAULT NULL,
`history_drug_backup` text COMMENT ‘用药史归档’,
`history_allergy_backup` text COMMENT ‘过敏史归档’,
`history_operation_backup` text COMMENT ‘手术史归档’,
`history_bloodtrans_backup` text COMMENT ‘输血史归档’,
`history_injury_backup` text COMMENT ‘外伤史归档’,
`history_familydisease_backup` text COMMENT ‘家族疾病史归档’,
`history_geneticdisease_backup` text COMMENT ‘遗传史归档’,
`isvalid` char(1) NOT NULL DEFAULT ‘1’ COMMENT ‘是否可用’,
`sts` char(1) NOT NULL DEFAULT ‘1’ COMMENT ‘是否删除’,
`create_id` bigint(20) DEFAULT NULL COMMENT ‘创建人’,
`create_time` datetime DEFAULT NULL COMMENT ‘创建时间’,
`modify_id` bigint(20) DEFAULT NULL COMMENT ‘修改人’,
`modify_time` datetime DEFAULT NULL COMMENT ‘修改时间’,
`remark` varchar(200) DEFAULT NULL COMMENT ‘备注’,
`height` varchar(20) DEFAULT NULL COMMENT ‘身高’,
`weight` varchar(20) DEFAULT NULL COMMENT ‘体重’,
`identity` varchar(50) DEFAULT NULL COMMENT ‘身份证号’,
`telephone` varchar(50) DEFAULT NULL COMMENT ‘固定电话’,
`service_id` bigint(20) DEFAULT NULL COMMENT ‘服务order_id’,
`china_birthday` varchar(50) DEFAULT NULL COMMENT ‘农历生日’,
`user_service_id` bigint(20) DEFAULT NULL COMMENT ‘服务id’,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3835 DEFAULT CHARSET=utf8 COMMENT=’客户历史档案’;
2、插入相关数据
INSERT INTO `guns_uts_hs`.`cus_history`(`id`, `customer_id`, `name`, `sex`, `sex_name`, `birthday`, `birtydaytype`, `birtydaytype_name`, `age`, `nation`, `nation_name`, `religion`, `religion_name`, `phone`, `marriage`, `marriage_name`, `service_gradation`, `service_gradation_name`, `occupation`, `occupation_name`, `education`, `education_name`, `blood`, `blood_name`, `blood_rh`, `blood_rh_name`, `kind`, `kind_name`, `gradation`, `gradation_name`, `register_addr`, `contact_addr`, `address_backup`, `relations_backup`, `allowancetype_backup`, `medicaltype_backup`, `deformitytype_backup_json`, `deformitytype_backup`, `history_disease_backup_json`, `history_disease_backup`, `history_drug_backup_json`, `history_drug_backup`, `history_allergy_backup`, `history_operation_backup`, `history_bloodtrans_backup`, `history_injury_backup`, `history_familydisease_backup`, `history_geneticdisease_backup`, `isvalid`, `sts`, `create_id`, `create_time`, `modify_id`, `modify_time`, `remark`, `height`, `weight`, `identity`, `telephone`, `service_id`, `china_birthday`, `user_service_id`) VALUES (3832, 53543, ‘Object’, ’01’, ‘男’, ‘2017-09-02′, ’02’, ‘阳历’, ‘2’, ’01’, ‘汉族’, ’03’, ‘佛教’, ‘18595921011’, ’01’, ‘已婚’, ‘1000’, ‘轻度依赖’, ’01’, ‘国家机关、党群组织、企业、事业单位负责人’, ’01’, ‘研究生’, ’01’, ‘A型’, ’01’, ‘阴性’, NULL, NULL, NULL, NULL, ‘河南省信阳市平桥区’, ‘杭州市下城区西湖文化广场’, NULL, ‘[{\”contactnumber\”:\”18598961010\”,\”name\”:\”小黑\”,\”relationtype\”:\”06\”,\”relationtypeName\”:\”弟弟\”,\”remark\”:\”0\”},{\”contactnumber\”:\”18598971010\”,\”name\”:\”小白\”,\”relationtype\”:\”05\”,\”relationtypeName\”:\”哥哥\”,\”remark\”:\”0\”},{\”contactnumber\”:\”18597981010\”,\”name\”:\”小明\”,\”relationtype\”:\”09\”,\”relationtypeName\”:\”儿子\”,\”remark\”:\”1\”}]’, ‘{\”allowance\”:\”01\”,\”allowanceName\”:\”国家定期抚恤补助优抚对象\”}’, ‘{\”isdefault\”:\”1\”,\”medicalvalue\”:\”城镇职工基本医疗保险\”}’, NULL, ‘[]’, NULL, ‘[{\”diseasename\”:\”糖尿病\”,\”isdefault\”:\”1\”},{\”diseasename\”:\”冠心病\”,\”isdefault\”:\”1\”},{\”diseasename\”:\”慢性阻塞性肺病\”,\”isdefault\”:\”1\”}]’, NULL, ‘[]’, ‘[{\”drugname\”:\”青霉素\”,\”isdefault\”:\”1\”},{\”drugname\”:\”磺胺\”,\”isdefault\”:\”1\”}]’, ‘[{\”operationdate\”:\”2019-11-01\”,\”operationname\”:\”肠胃炎手术\”}]’, ‘[{\”historyname\”:\”二次输血的\”,\”modifyId\”:225,\”transdate\”:\”2019-11-01\”}]’, ‘[{\”historyname\”:\”破皮流血\”,\”injurydate\”:\”2019-11-01\”}]’, ‘[{\”diseasename\”:\”糖尿病\”,\”isdefault\”:\”1\”,\”relationtype\”:\”01\”,\”relationtypeName\”:\”父亲\”},{\”diseasename\”:\”脑卒中\”,\”isdefault\”:\”1\”,\”relationtype\”:\”01\”,\”relationtypeName\”:\”父亲\”},{\”diseasename\”:\”冠心病\”,\”isdefault\”:\”1\”,\”relationtype\”:\”02\”,\”relationtypeName\”:\”母亲\”},{\”diseasename\”:\”慢性阻塞性肺病\”,\”isdefault\”:\”1\”,\”relationtype\”:\”02\”,\”relationtypeName\”:\”母亲\”},{\”diseasename\”:\”慢性阻塞性肺病\”,\”isdefault\”:\”1\”,\”relationtype\”:\”03\”,\”relationtypeName\”:\”兄弟姐妹\”},{\”diseasename\”:\”恶性肿瘤\”,\”isdefault\”:\”1\”,\”relationtype\”:\”03\”,\”relationtypeName\”:\”兄弟姐妹\”},{\”diseasename\”:\”肝炎\”,\”isdefault\”:\”1\”,\”relationtype\”:\”04\”,\”relationtypeName\”:\”子女\”},{\”diseasename\”:\”结核病\”,\”isdefault\”:\”1\”,\”relationtype\”:\”04\”,\”relationtypeName\”:\”子女\”}]’, ‘[{\”createTime\”:\”2019-11-02\”,\”diseasename\”:\”开心病\”,\”index\”:1}]’, ‘1’, ‘1’, 225, ‘2019-11-02 11:31:15’, 225, ‘2019-11-02 11:31:15’, NULL, ”, ”, ‘000000201709020012’, NULL, 254790, ‘2017年七月十二’, 40558);
二、执行json_extract()
1、使用json_extract()来处理数据
2、使用方式
$ . paramsName
:取出一个key对应的value。$ **.paramsName
、$ .[*].paramsName
:取出json数组所有该字段key对应的value并以,的方式拼接在一起
MySql中json_extract函数的一个特殊之处
MySql自5.7之后开始支持json类型,相应的解析函数主要是json_extract(与操作符“->”等效)。
不过与其它数据库的类似函数(如oradle的json_value)相比,当json的值是字符类型时,json_extract的结果略有不同。
在MySql中,是这样的
而在Oracle中,是这样的
可见,差别在于MySql的json_extract的返回值会带上两个双引号。
而当json的值是数值型时,没有差别。
为保持各种情况下的一致,在MySql中要解析json,还需再加上json_unquote函数以去掉双引号:
json_unquote(json_extract())的等效操作符是“->>”。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。