首頁 > 軟體

MySQL中json_extract()函數的使用範例

2022-07-05 14:06:06

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='客戶歷史檔案';

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())的等效操作符是“->>”。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com