1. 程式人生 > 實用技巧 >MySQL中函式

MySQL中函式

Mysql中的JSON系列操作函式

一、方法羅列:

分類 函式 描述
建立json
json_array 建立json陣列
json_object 建立json物件
json_quote 將json轉成json字串型別
查詢json 
json_contains 判斷是否包含某個json值
json_contains_path 判斷某個路徑下是否包json值
json_extract 提取json值
column->path        json_extract的簡潔寫法,MySQL 5.7.9開始支援
column->>path      json_unquote(column -> path)的簡潔寫法
json_keys 提取json中的鍵值為json陣列
json_search 按給定字串關鍵字搜尋json,返回匹配的路徑
修改json 
json_append 廢棄,MySQL 
5.7.9開始改名為json_array_append json_array_append 末尾新增陣列元素,如果原有值是數值或json對 象,則轉成陣列後,再新增元素 json_array_insert 插入陣列元素 json_insert 插入值(插入新值,但不替換已經存在的舊值) json_merge 合併json陣列或物件 json_remove 刪除json資料 json_replace 替換值(只替換已經存在的舊值) json_set 設定值(替換舊值,並插入不存在的新值) json_unquote 去除json字串的引號,將值轉成string型別 返回json屬性 json_depth 返回json文件的最大深度 json_length 返回json文件的長度 json_type 返回json值得型別 json_valid 判斷是否為合法json文件 二、使用例子: MySQL
5.7.8開始支援 json型別. create table t(id int,js json,PRIMARY KEY (`id`)) 插入資料 insert into t values(1,'{"a":1,"s":"abc"}') insert into t values(2,'[1,2,{"a":123}]') insert into t values(3,'"str"') insert into t values(4,'123') 直接提供字串即可。還可以用JSON_Array和JSON_Object函式來構造 insert into t values(5,JSON_Object('
key1',v1,'key2',v2)) insert into t values(4,JSON_Array(v1,v2,v3)) JSON_OBJECT([key, val[, key, val] ...]) JSON_ARRAY([val[, val] ...]) JSON_SET(json_doc, path, val[, path, val] ...) 修改資料 update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1 結果js={"a":456,"s":"abc","b":"bbb"} path中$就代表整個doc,然後可以用JavaScript的方式指定物件屬性或者陣列下標等. 執行效果,類似json的語法 $.a=456 $.b="bbb" 存在就修改,不存在就設定. $.c.c=123 這個在javascript中會出錯,因為.c為null。 但是在json_set('{}','$.c.c',123)中,不存在的路徑將直接被忽略。 特殊的對於陣列,如果目標doc不是陣列則會被轉換成[doc],然後再執行set, 如果set的下標超過陣列長度,只會新增到陣列結尾。 select json_set('{"a":456}','$[1]',123) 結果[{"a":456},123]。目標現被轉換成[{"a":456}],然後應用$[1]=123select json_set('"abc"','$[999]',123) 結果["abc",123]。 再舉幾個例子 select json_set('[1,2,3]','$[0]',456,'$[3]','bbb') 結果[456,2,3,'bbb'] 注意: 對於javascript中 var a=[1,2,3] a.a='abc' 是合法的,但是一旦a轉成json字串,a.a就丟失了。 而在mysql中,這種算作路徑不存在,因此 select json_set('[1,2,3]','$.a',456) 結果還是[1,2,3] 然後還有另外兩個版本 JSON_INSERT(json_doc, path, val[, path, val] ...) 如果不存在對應屬性則插入,否則不做任何變動 JSON_REPLACE(json_doc, path, val[, path, val] ...) 如果存在則替換,否則不做任何變動 這兩個操作倒是沒有javascript直接對應的操作 select json_insert('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') 結果{"a":1,"s":"abc","b":"bbb"} select json_replace('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') 結果{"a":456,"s":"abc"} 加上刪除節點 JSON_REMOVE(json_doc, path[, path] ...) 如果存在則刪除對應屬性,否則不做任何變動 select json_replace('{"a":1,"s":"abc"}','$.a','$.b') 結果{"s":"abc"} 涉及陣列時,三個函式與json_set基本一樣 select json_insert('{"a":1}','$[0]',456) 結果不變,認為0元素已經存在了,注意這裡結果不是[{"a":1}] select json_insert('{"a":1}','$[999]',456) 結果追加到陣列結尾[{"a":1},456] select json_replace('{"a":1}','$[0]',456) 結果456!而非[456] select json_replace('{"a":1}','$[1]',456) 結果不變。 其實對於json_insert和json_replace來說一般情況沒必要針對陣列使用。 select json_remove('{"a":1}','$[0]') 結果不變! select json_remove('[{"a":1}]','$[0]') 結果[] 總之涉及陣列的時候要小心。 JSON_MERGE(json_doc, json_doc[, json_doc] ...) 將多個doc合併 select json_merge('[1,2,3]','[4,5]') 結果[1,2,3,4,5]。陣列簡單擴充套件 select json_merge('{"a":1}','{"b":2}') 結果{"a":1,"b":2}。兩個物件直接融合。 特殊的還是在陣列 select json_merge('123','45') 結果[123,45]。兩個常量變成陣列 select json_merge('{"a":1}','[1,2]') 結果[{"a":1},1,2]。目標碰到陣列,先轉換成[doc] select json_merge('[1,2]','{"a":1}') 結果[1,2,{"a":1}]。非陣列都追加到陣列後面。 JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...) 給指定的節點,新增元素,如果節點不是陣列,則先轉換成[doc] select json_Array_append('[1,2]','$','456') 結果[1,2,456] select json_Array_append('[1,2]','$[0]','456') 結果[[1,456],2]。指定插在$[0]這個節點,這個節點非陣列,所以等效為 select json_Array_append('[[1],2]','$[0]','456') JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...) 在陣列的指定下標處插入元素 SELECT JSON_ARRAY_INSERT('[1,2,3]','$[1]',4) 結果[1,4,2,3]。在$陣列的下標1處插入 SELECT JSON_ARRAY_INSERT('[1,[1,2,3],3]','$[1][1]',4) 結果[1,[1,4,2,3],3]。在$[1]陣列的下標1處插入 SELECT JSON_ARRAY_INSERT('[1,2,3]','$[0]',4,'$[1]',5) 結果[4,5,1,2,3]。注意後續插入是在前面插入基礎上的,而非[4,1,5,2,3] 提取json資訊的函式 JSON_KEYS(json_doc[, path]) 返回指定path的key select json_keys('{"a":1,"b":2}') 結果["a","b"] select json_keys('{"a":1,"b":[1,2,3]}','$.b') 結果null。陣列沒有key JSON_CONTAINS(json_doc, val[, path]) 是否包含子文件 select json_contains('{"a":1,"b":4}','{"a":1}') 結果1 select json_contains('{"a":2,"b":1}','{"a":1}') 結果0 select json_contains('{"a":[1,2,3],"b":1}','[1,2]','$.a') 結果1。陣列包含則需要所有元素都存在。 select json_contains('{"a":[1,2,3],"b":1}','1','$.a') 結果1。元素存在陣列元素中。 JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...) 檢查路徑是否存在 select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'one','$.a','$.c') 結果1。只要存在一個 select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'all','$.a','$.c') 結果0。必須全部存在。 select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.b.c.d') 結果1。 select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.a.c.d') 結果0。 JSON_EXTRACT(json_doc, path[, path] ...) 獲得doc中某個或多個節點的值。 select json_extract('{"a":1,"b":2}','$.a') 結果1 select json_extract('{"a":[1,2,3],"b":2}','$.a[1]') 結果2 select json_extract('{"a":{"a":1,"b":2,"c":3},"b":2}','$.a.*') 結果[1,2,3]。a.*通配a所有屬性的值返回成陣列。 select json_extract('{"a":{"a":1,"b":2,"c":3},"b":4}','$**.b') 結果[2,4]。通配$中所有層次下的屬性b的值返回成陣列。 mysql5.7.9開始增加了一種簡寫方式:column->path select id,js->'$.id' from t where js->'$.a'=1 order by js->'$.b' 等價於 select id,json_extract(js,'$.id') from t where json_extract(js,'$.a')=1 order by json_extract(js,'$.b') JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...]) 強大的查詢函式,用於在doc中返回符合條件的節點,select則是在表中返回符合要求的紀錄。 select json_search('{"a":"abc","b":{"c":"dad"}}','one','%a%') 結果$.a。和like一樣可以用%和_匹配,在所有節點的值中匹配,one只返回一個。 select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%') 結果["$.a","$.b.c"] select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%',null,'$.b') 結果["$.b.c"]。限制查詢範圍。 select json_search('{"a":"abc","b":{"c":"dad"},"c":{"b":"aaa"}}','all','%a%',null,'$**.b') 結果["$.b.c","$.c.b"]。查詢範圍還可使用萬用字元!在每個匹配節點和其下查詢。 注意,只有json_extract和json_search中的path才支援通配,其他json_set,json_insert等都不支援。 JSON_LENGTH(json_doc[, path]) 返回陣列的長度,如果是object則是屬性個數,常量則為1 select json_length('[1,2,3]') 結果3 select json_length('123') 結果1 select json_length('{"a":1,"b":2}') 結果2 可再跟path引數 select json_length('{"a":1,"b":[1,2,3]}','$.b') 結果3 JSON_DEPTH(json_doc) 返回doc深度 select json_depth('{}'),json_depth('[]'),json_depth('123') 結果1,1,1 select json_depth('[1,2,3,4,5,6]') 結果2 select json_depth('{"a":{"b":{"c":1}}}') 結果4

https://www.cnblogs.com/xyj179/p/11451593.html