詳解Mysql中的JSON系列操作函數(shù)

一摄悯、方法羅列:

分類 函數(shù) 描述
創(chuàng)建json
json_array 創(chuàng)建json數(shù)組
json_object 創(chuàng)建json對(duì)象
json_quote 將json轉(zhuǎn)成json字符串類型
查詢json
json_contains 判斷是否包含某個(gè)json值
json_contains_path 判斷某個(gè)路徑下是否包json值
json_extract 提取json值
column->path json_extract的簡(jiǎn)潔寫法,MySQL 5.7.9開始支持
column->>path json_unquote(column -> path)的簡(jiǎn)潔寫法
json_keys 提取json中的鍵值為json數(shù)組
json_search 按給定字符串關(guān)鍵字搜索json射众,返回匹配的路徑
修改json
json_append 廢棄晃财,MySQL 5.7.9開始改名為json_array_append
json_array_append 末尾添加數(shù)組元素,如果原有值是數(shù)值或json對(duì) 象断盛,則轉(zhuǎn)成數(shù)組后,再添加元素
json_array_insert 插入數(shù)組元素
json_insert 插入值(插入新值钢猛,但不替換已經(jīng)存在的舊值)
json_merge 合并json數(shù)組或?qū)ο?br> json_remove 刪除json數(shù)據(jù)
json_replace 替換值(只替換已經(jīng)存在的舊值)
json_set 設(shè)置值(替換舊值,并插入不存在的新值)
json_unquote 去除json字符串的引號(hào)命迈,將值轉(zhuǎn)成string類型
返回json屬性
json_depth 返回json文檔的最大深度
json_length 返回json文檔的長(zhǎng)度
json_type 返回json值得類型
json_valid 判斷是否為合法json文檔

二、使用例子:

MySQL 5.7.8開始支持 json類型.

create table t(id int,js json,PRIMARY KEY (id))

插入數(shù)據(jù)
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函數(shù)來構(gòu)造
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] ...)
修改數(shù)據(jù)

update t set js=json_set('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb') where id=1

結(jié)果js={"a":456,"s":"abc","b":"bbb"}

path中就代表整個(gè)doc,然后可以用[JavaScript](http://lib.csdn.net/base/javascript "JavaScript知識(shí)庫(kù)")的方式指定對(duì)象屬性或者數(shù)組下標(biāo)等. 執(zhí)行效果,類似json的語(yǔ)法.a=456
$.b="bbb"
存在就修改,不存在就設(shè)置.

$.c.c=123

這個(gè)在javascript中會(huì)出錯(cuò)娇哆,因?yàn)?c為null。
但是在json_set('{}','$.c.c',123)中碍讨,不存在的路徑將直接被忽略。

特殊的對(duì)于數(shù)組勃黍,如果目標(biāo)doc不是數(shù)組則會(huì)被轉(zhuǎn)換成[doc],然后再執(zhí)行set溉躲,
如果set的下標(biāo)超過數(shù)組長(zhǎng)度,只會(huì)添加到數(shù)組結(jié)尾益兄。

select json_set('{"a":456}','$[1]',123)

結(jié)果[{"a":456},123]锻梳。目標(biāo)現(xiàn)被轉(zhuǎn)換成[{"a":456}],然后應(yīng)用$[1]=123净捅。

select json_set('"abc"','$[999]',123)
結(jié)果["abc",123]。

再舉幾個(gè)例子

select json_set('[1,2,3]','$[0]',456,'$[3]','bbb')

結(jié)果[456,2,3,'bbb']

注意:
對(duì)于javascript中
var a=[1,2,3]
a.a='abc'
是合法的,但是一旦a轉(zhuǎn)成json字符串,a.a就丟失了蛔六。

而在mysql中废亭,這種算作路徑不存在具钥,因此
select json_set('[1,2,3]','$.a',456)
結(jié)果還是[1,2,3]

然后還有另外兩個(gè)版本
JSON_INSERT(json_doc, path, val[, path, val] ...)
如果不存在對(duì)應(yīng)屬性則插入,否則不做任何變動(dòng)

JSON_REPLACE(json_doc, path, val[, path, val] ...)
如果存在則替換,否則不做任何變動(dòng)

這兩個(gè)操作倒是沒有javascript直接對(duì)應(yīng)的操作

select json_insert('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
結(jié)果{"a":1,"s":"abc","b":"bbb"}

select json_replace('{"a":1,"s":"abc"}','$.a',456,'$.b','bbb')
結(jié)果{"a":456,"s":"abc"}

加上刪除節(jié)點(diǎn)
JSON_REMOVE(json_doc, path[, path] ...)
如果存在則刪除對(duì)應(yīng)屬性,否則不做任何變動(dòng)
select json_replace('{"a":1,"s":"abc"}','.a','.b')
結(jié)果{"s":"abc"}

涉及數(shù)組時(shí),三個(gè)函數(shù)與json_set基本一樣
select json_insert('{"a":1}','$[0]',456)
結(jié)果不變骂删,認(rèn)為0元素已經(jīng)存在了,注意這里結(jié)果不是[{"a":1}]

select json_insert('{"a":1}','$[999]',456)
結(jié)果追加到數(shù)組結(jié)尾[{"a":1}宁玫,456]

select json_replace('{"a":1}','$[0]',456)
結(jié)果456!而非[456]

select json_replace('{"a":1}','$[1]',456)
結(jié)果不變欧瘪。

其實(shí)對(duì)于json_insert和json_replace來說一般情況沒必要針對(duì)數(shù)組使用。

select json_remove('{"a":1}','$[0]')
結(jié)果不變佛掖!

select json_remove('[{"a":1}]','$[0]')
結(jié)果[]

總之涉及數(shù)組的時(shí)候要小心。

JSON_MERGE(json_doc, json_doc[, json_doc] ...)
將多個(gè)doc合并

select json_merge('[1,2,3]','[4,5]')
結(jié)果[1,2,3,4,5]芥被。數(shù)組簡(jiǎn)單擴(kuò)展

select json_merge('{"a":1}','{"b":2}')
結(jié)果{"a":1,"b":2}。兩個(gè)對(duì)象直接融合撕彤。

特殊的還是在數(shù)組
select json_merge('123','45')
結(jié)果[123,45]。兩個(gè)常量變成數(shù)組

select json_merge('{"a":1}','[1羹铅,2]')
結(jié)果[{"a":1},1,2]。目標(biāo)碰到數(shù)組职员,先轉(zhuǎn)換成[doc]

select json_merge('[1,2]','{"a":1}')
結(jié)果[1,2,{"a":1}]。非數(shù)組都追加到數(shù)組后面焊切。

JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
給指定的節(jié)點(diǎn),添加元素专肪,如果節(jié)點(diǎn)不是數(shù)組,則先轉(zhuǎn)換成[doc]

select json_Array_append('[1,2]','/article>,'456')
結(jié)果[1,2,456]

select json_Array_append('[1,2]','$[0]','456')

結(jié)果[[1,456],2]嚎尤。指定插在[0]這個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)非數(shù)組,所以等效為 select json_Array_append('[[1],2]','[0]','456')

JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
在數(shù)組的指定下標(biāo)處插入元素

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[1]',4)
結(jié)果[1,4,2,3]乏梁。在$數(shù)組的下標(biāo)1處插入

SELECT JSON_ARRAY_INSERT('[1,[1,2,3],3]','$[1][1]',4)
結(jié)果[1,[1,4,2,3],3]。在$[1]數(shù)組的下標(biāo)1處插入

SELECT JSON_ARRAY_INSERT('[1,2,3]','$[0]',4,'$[1]',5)
結(jié)果[4,5,1,2,3]遇骑。注意后續(xù)插入是在前面插入基礎(chǔ)上的,而非[4,1,5,2,3]

提取json信息的函數(shù)
JSON_KEYS(json_doc[, path])
返回指定path的key

select json_keys('{"a":1,"b":2}')
結(jié)果["a","b"]

select json_keys('{"a":1,"b":[1,2,3]}','$.b')
結(jié)果null落萎。數(shù)組沒有key

JSON_CONTAINS(json_doc, val[, path])
是否包含子文檔

select json_contains('{"a":1,"b":4}','{"a":1}')
結(jié)果1

select json_contains('{"a":2,"b":1}','{"a":1}')
結(jié)果0

select json_contains('{"a":[1,2,3],"b":1}','[1,2]','$.a')
結(jié)果1。數(shù)組包含則需要所有元素都存在模暗。

select json_contains('{"a":[1,2,3],"b":1}','1','$.a')
結(jié)果1念祭。元素存在數(shù)組元素中。

JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
檢查路徑是否存在

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'one','$.a','$.c')
結(jié)果1粱坤。只要存在一個(gè)

select JSON_CONTAINS_PATH('{"a":1,"b":1}', 'all','$.a','$.c')
結(jié)果0隶糕。必須全部存在枚驻。

select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.b.c.d')
結(jié)果1。

select JSON_CONTAINS_PATH('{"a":1,"b":{"c":{"d":1}}}', 'one','$.a.c.d')
結(jié)果0株旷。

JSON_EXTRACT(json_doc, path[, path] ...)
獲得doc中某個(gè)或多個(gè)節(jié)點(diǎn)的值再登。

select json_extract('{"a":1,"b":2}','$.a')
結(jié)果1

select json_extract('{"a":[1,2,3],"b":2}','$.a[1]')
結(jié)果2

select json_extract('{"a":{"a":1,"b":2,"c":3},"b":2}','$.a.')
結(jié)果[1,2,3]晾剖。a.
通配a所有屬性的值返回成數(shù)組。

select json_extract('{"a":{"a":1,"b":2,"c":3},"b":4}','$**.b')
結(jié)果[2,4]齿尽。通配$中所有層次下的屬性b的值返回成數(shù)組。

mysql5.7.9開始增加了一種簡(jiǎn)寫方式:column->path

select id,js->'$.id' from t where js->'$.a'=1 order by js->'$.b'
等價(jià)于
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] ...])
強(qiáng)大的查詢函數(shù)循头,用于在doc中返回符合條件的節(jié)點(diǎn),select則是在表中返回符合要求的紀(jì)錄卡骂。

select json_search('{"a":"abc","b":{"c":"dad"}}','one','%a%')

結(jié)果$.a。和like一樣可以用%和_匹配全跨,在所有節(jié)點(diǎn)的值中匹配,one只返回一個(gè)。

select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%')
結(jié)果["$.a","$.b.c"]

select json_search('{"a":"abc","b":{"c":"dad"}}','all','%a%',null,'$.b')
結(jié)果["$.b.c"]盒使。限制查找范圍。

select json_search('{"a":"abc","b":{"c":"dad"},"c":{"b":"aaa"}}','all','%a%',null,'$**.b')
結(jié)果["$.b.c","$.c.b"]少办。查找范圍還可使用通配符!在每個(gè)匹配節(jié)點(diǎn)和其下查找英妓。

注意,只有json_extract和json_search中的path才支持通配蔓纠,其他json_set,json_insert等都不支持。

JSON_LENGTH(json_doc[, path])
返回?cái)?shù)組的長(zhǎng)度腿倚,如果是object則是屬性個(gè)數(shù)纯出,常量則為1

select json_length('[1,2,3]')
結(jié)果3

select json_length('123')
結(jié)果1

select json_length('{"a":1,"b":2}')
結(jié)果2

可再跟path參數(shù)
select json_length('{"a":1,"b":[1,2,3]}','$.b')
結(jié)果3

JSON_DEPTH(json_doc)
返回doc深度

select json_depth('{}')暂筝,json_depth('[]'),json_depth('123')
結(jié)果1,1,1

select json_depth('[1,2,3,4,5,6]')
結(jié)果2

select json_depth('{"a":{"b":{"c":1}}}')
結(jié)果4

參考:
http://www.jb51.net/article/89219.htm
http://blog.csdn.net/joker_honey/article/details/53081716

原文:
https://blog.csdn.net/jiangyu1013/article/details/78917425

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市硬贯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饭豹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拄衰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡肾砂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門镐确,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人源葫,你說我怎么就攤上這事∠⑻茫” “怎么了嚷狞?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)竭翠。 經(jīng)常有香客問我,道長(zhǎng)薇搁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任啃洋,我火速辦了婚禮,結(jié)果婚禮上宏娄,老公的妹妹穿的比我還像新娘。我一直安慰自己孵坚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布十饥。 她就那樣靜靜地躺著祖乳,像睡著了一般逗堵。 火紅的嫁衣襯著肌膚如雪眷昆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天亚斋,我揣著相機(jī)與錄音,去河邊找鬼帅刊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赖瞒,可吹牛的內(nèi)容都是我干的女揭。 我是一名探鬼主播吧兔,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼境蔼!你這毒婦竟也來了灶平?” 一聲冷哼從身側(cè)響起箍土,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吴藻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體调缨,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年弦叶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伤哺。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖立莉,靈堂內(nèi)的尸體忽然破棺而出绢彤,到底是詐尸還是另有隱情蜓耻,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布刹淌,位于F島的核電站,受9級(jí)特大地震影響有勾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔼卡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雇逞。 院中可真熱鬧荤懂,春花似錦喝峦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至霜威,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間册烈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工赏僧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人淀零。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驾中,于是被迫代替她去往敵國(guó)和親唉堪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肩民,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容