前言
在工作中,遇到這種情況,某些字段存儲的是josn格式,之前的做法是先查出數據然後進行json_decode()處理,然後再進行相關操作;最近發現了MySQL也支持一些json系列的操作函數,所以記錄下來,以後可以更加方便快捷對此類數據進行靈活操作。
帶有json格式字段的數據表
注:以下函數僅針對MySQL5.7及以上版本;如果SQL語句報錯,請先查看MySQL版本。
JOSN相關查詢操作
(1)JSON_CONTAINS -- 獲取josn字段中包含某一項的數據
-- 查詢"projext_type" 字段中有"博士項目"的數據
SELECT * FROM crm_test WHERE JSON_CONTAINS(project_type, '["博士項目"]');
查詢結果:
(2)JSON_SEARCH -- JSON_SEARCH(字段,[ 'one':第一個符合條件 | 'all':所有符合條件],查找的條件)
-- 查詢"project_type"字段中以 "專業"開頭的字段
SELECT * FROM crm_test WHERE JSON_SEARCH(project_type,'one','專業%') IS NOT NULL
查詢結果:
(3) JSON Path -- 精準獲取josn中的某個數據
-- 獲取project_type字段中 josn數組的第二個元素(注:下標從0開始)
SELECT project_type->>"$[1]" as 'type' FROM crm_test
查詢結果:
(4)JSON_UNQUOTE -- 獲取json字段中的某一項
-- 獲取id爲6的name,和project_type 字段中的 cphone字段
select name,JSON_UNQUOTE(project_type->'$.cphone') as cphone from crm_test where id=6
-- 等價於
select name,project_type->>'$.cphone' as cphone from crm_test where id=6
數據結構:
查詢結果:
JOSN相關更新操作
(1)JSON_MERGE -- 追加
-- 將id爲5的 project_type 字段追加 "合作辦學"
UPDATE crm_test SET project_type = JSON_MERGE(project_type,'["合作辦學"]') WHERE id = 5;
效果前:
效果後:
(2)JSON_SET -- 更改(替換已經存在的值,增加不存在的值)
-- 將id爲3的,josn第一個元素 更改爲"同等學力"
UPDATE crm_test SET project_type = JSON_SET(project_type, '$[0]','同等學力') WHERE id = 3;
效果前:
效果後:
(3)JSON_INSERT -- 插入新值(新增不存在的值)
-- 將id爲3的project_type 新增"合作辦學"
UPDATE crm_test SET project_type = JSON_INSERT(project_type, '$[1]','合作辦學') WHERE id = 3;
-- JSON_INSERT(json_doc, path, val[, path, val] ...)
-- json_doc 是JSON字符串
-- path 是要插入數據或更新值的元素的路徑
-- val 是新的值
效果前:
效果後:
(4)JSON_REPLACE -- 替換(替換/修改已經存在的值)
-- 將id爲1的project_type 字段的第一個元素替換成"同等學力"
UPDATE crm_test SET project_type = JSON_REPLACE(project_type, '$[0]','同等學力') WHERE id = 1;
效果前:
效果後:
(5)JSON_ARRAY_APPEND -- 向指定位置尾部追加數據
UPDATE crm_test SET project_type = JSON_ARRAY_APPEND(project_type, '$[2]',"博士項目") WHERE id = 2;
效果前:
效果後:
(6)JSON_REMOVE -- 從指定位置移除數據
-- 將id爲4的數據中 project_type josn數組中的第一個元素刪除掉
UPDATE crm_test SET project_type = JSON_REMOVE(project_type, '$[0]') WHERE id = 4;
效果前:
效果後: