本文實例講述了mysql5.7 新增的json字段類型用法。分享給大家供大家參考,具體如下:
一、我們先創建一個表,準備點數據
1
2
3
4
5
|
create table `json_test` ( `id` int (11) unsigned not null auto_increment comment 'id' , `json` json default null comment 'json數據' , primary key (`id`) ) engine=innodb default charset=utf8mb4; |
二、檢索json列的字段
通過使用 -> 或 ->> 運算符檢索json列的字段
1
|
select id, json-> '$[0].items[0].name' from json_test; |
1
|
select id, json->> '$[0].items[0].name' from json_test; |
使用 -> 和 ->> 的區別是結果用了引號包裹。
三、處理json的一些函數
json_pretty(json_val) 以優雅的格式顯示json值
1
|
select id, json_pretty(json) from json_test\g; |
json_contains(target, candidate[, path]) 判斷給定的candidate是否包含在target中,如果指定了path,則在指定路徑中進行查找。
注意,注意,注意,這里的candidate如果是數字,需要用單引號包裹,如果是字符串,單引號里再加上雙引號包裹。
1
2
|
select json_contains(json-> '$[0].name' , '"1號籃子"' ) from json_test; select json_contains(json, '"1號籃子"' , '$[0].name' ) from json_test; |
json_contains_path(json_doc, one_or_all, path[, path] ...) 判斷json_doc中的路徑是否存在,通俗點說就是json中的key是否存在
1
|
select json_contains_path(json, 'one' , '$[0].name' , '$[0].test' ) from json_test; |
第二個參數'one'表示只要有一個key存在就返回1,否則為0
1
|
select json_contains_path(json, 'all' , '$[0].name' , '$[0].test' ) from json_test; |
第二個參數'all'表示所有key存在才返回1,否則為0
json_set(json_doc, path, val[, path, val] ...) 插入或更新數據并返回結果
1
|
select json_set(json, '$[0].name' , '2號籃子' , '$[0].test' , 'test' ) from json_test; |
我們修改$[0].name的值,并添加一個key為test,值為test的項
json_insert(json_doc, path, val[, path, val] ...) 插入數據并返回結果,但不替換現有值。
1
|
select json_insert(json, '$[0].name' , '2號籃子' , '$[0].exts' , '擴展' ) from json_test; |
這時$[0].name不會被更新,只會新增一個字段$[0].exts
json_replace(json_doc, path, val[, path, val] ...) 替換現有值并返回結果
1
|
select json_replace(json, '$[0].name' , '替換' ) from json_test; |
將$[0].name中的值替換成新值
json_remove(json_doc, path[, path] ...) 刪除數據并返回結果
1
|
select json_remove(json, '$[0].name' ) from json_test; |
刪除$[0].name這項數據
json_keys(json_doc[, path]) 獲取json文檔中的所有鍵
1
|
select json_keys(json, '$[0]' ) from json_test; |
獲取$[0]路徑下的所有鍵
json_length(json_doc[, path]) 獲取json文檔的長度
1
|
select json_length(json, '$[0]' ) from json_test; |
獲取$[0]下的元素數量
json_extract(json_doc, path[, path] ...) 返回json文檔中的數據
1
2
|
select json_extract(json, '$[0]' ) from json_test; select json_extract(json, '$[0].name' ) from json_test; |
返回json文檔指定路徑下的數據
json_array([val[, val] ...]) 創建json數組
1
|
select json_array(1, '2' , true , 5.6, null , now()); |
json_object([key, val[, key, val] ...]) 通過鍵值對, 創建json對象
1
|
select json_object( 'name' , 'xiaoxu' , 'age' , 28, 'height' , 1.72); |
注意,這里鍵和值要成對出現
json_merge_patch(json_doc, json_doc[, json_doc] ...) 合并json文檔,如果有重復鍵,后面的數據覆蓋前面的
1
|
select json_merge_patch( '{"name":"test1"}' , '{"name":"test2"}' ); |
json_merge_preserve(json_doc, json_doc[, json_doc] ...) 合并json文檔,如果有重復鍵,則會通過數組把值都保存起來
1
|
select json_merge_preserve( '{"name":"test1"}' , '{"name":"test2"}' ); |
json_quote(string) 通過用雙引號字符包裹并轉義內部引號和其他字符
1
|
select json_quote( '你好"世界"' ); |
json_unquote(json_val) 將轉義字符轉換回普通字符
1
|
select json_unquote( '你好\\t\"世界\"' ); |
希望本文所述對大家MySQL數據庫計有所幫助。
原文鏈接:https://www.cnblogs.com/jkko123/p/10171167.html