1. 程式人生 > >MySQL 5.7之JSON特性

MySQL 5.7之JSON特性

    Mysql 5.7之後開始支援Json格式的原生欄位型別,現將json新特性作如下整理,僅供參考。

JSON函式的完整列表:

Mysql官方給出的json相關的函式,完整列表如下:

分類

函式

描述

示例

結果展示

建立JSON

JSON_ARRAY

建立JSON陣列

JSON_ARRAY(1,2)

[1, 2]

JSON_OBJECT

建立JSON物件

JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','這是第一條測試objcet的記錄')

{"id": 1541560547, "remark": "這是第一條測試objcet的記錄"}

JSON_QUOTE

將json轉成json字串型別

JSON_QUOTE('[1,2]')

"[1,2]"

查詢JSON

JSON_CONTAINS

判斷是否包含某個JSON值

JSON_CONTAINS(`json_arr_test`,'[1]')

JSON_CONTAINS_PATH

判斷某個路徑下是否包含json值

JSON_CONTAINS_PATH(`json_obj_test`,'one','$.remark','$.b')

見下

JSON_EXTRACT

提取JSON值

JSON_EXTRACT(`json_arr_test`,'$[1]') || `json_obj_test`->'$.id'

2 其中,如果引數為'$',則返回整個json陣列

json_extract的簡潔寫法,

`json_obj_test`->'$.id',MySQL 5.7.9開始支援

JSON_KEYS

提取json中的鍵值為json陣列

JSON_KEYS(`json_obj_test`)

["id","remark"]

JSON_SEARCH

按給定字串關鍵字搜尋json,返回匹配的路徑

JSON_SEARCH(`json_arr_test`,「'one'|'all'」,'01278923')

"$[2].code"

修改JSON

JSON_APPEND

廢棄,MySQL 5.7.9開始改名為json_array_append

JSON_ARRAY_APPEND

末尾新增陣列元素,如果原有值是數值或json物件,則轉成陣列後,再新增元素

JSON_ARRAY_APPEND(`json_arr_test`,'$',JSON_OBJECT('code','01278923','name','Wyao'))

注意:插入之前要確保欄位不為null,否則插入不成功。

[1,2,{"code":"01278923","name":"Wyao"}]

JSON_ARRAY_INSERT

向指定位置插入陣列元素

JSON_ARRAY_INSERT(`json_arr_test`,'$[2]',JSON_OBJECT('course_code','02','course','Math'))

[3,4,{"course":"Math","course_code":"02"}]

JSON_INSERT

插入值(如果不存在則插入新值,如果存在則不作操作。)

JSON_INSERT(`json_obj_test`,'$.id',012923,'$.status',1)

因為id值已存在,所以無法插入新值。

{"id":1541560547,"remark":"這是第一條測試objcet的記錄","status":1}

JSON_MERGE

合併JSON陣列或者物件

JSON_MERGE_PRESERVE(`json_arr_test`->'$[0]',`json_arr_test`->'$[1]')

JSON_REMOVE

刪除JSON資料

JSON_REMOVE(`json_arr_test`,'$[0]')

JSON_REPLACE

替換值(只對存在的key有效。)

JSON_REPLACE(`json_arr_test`,'$[0]','[true, false]')

[4] => ["[true,false]"]

JSON_SET

設定值,如果存在,則覆蓋值;如果不存在,則新增值。

JSON_SET(`json_arr_test`,'$[0]','Wyao','$[1]','[true,false]')

["[true,false]"] => ["Wyao","[true,false]"]

JSON_UNQUOTE

去除JSON字串的引號,將值轉換成string型別。(去掉引用(引號),返回一個utf8mb4格式的字串)

JSON_UNQUOTE(`json_arr_test`)

JSON屬性

JSON_DEPTH

返回JSON文件的最大深度

JSON_DEPTH(json_obj_test) 【key的深度】

JSON_LENGTH

返回JSON文件的最大長度

JSON_LENGTH(json_obj_test) 【key的長度】

JSON_TYPE

返回JSON值的型別

JSON_TYPE(json_arr_test)

JSON_VALID

判斷是否為合法JSON文件

JSON_VALID(json_arr_test)

Returns 0 or 1 to indicate whether a value is valid JSON. Returns NULL if the argument is NULL.

註釋:

  • JSON_CONTAINS_PATH:【JSON_CONTAINS_PATH(`json_obj_test`,「'one'|'all'」,'$.remark','$.b')】
    • 'one': 1 if at least one path exists within the document, 0 otherwise.(至少有一個在此json(`json_obj_test`)段中,沒有返回0)
      • SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'one','$.remark','$.b');
    • 'all': 1 if all paths exist within the document, 0 otherwise.(變數全部在此JSON(`json_obj_test`)段中,否則查詢為0)
      • SELECT `operator`,`json_arr_test`FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'all','$.remark','$.b');
  • JSON_EXTRACT:【JSON_EXTRACT(`json_obj_test`,'$.id') <=> `json_obj_test`->'$.id'】In MySQL 5.7.9 and later
    • SELECT `id`, `operator`, JSON_EXTRACT(`json_obj_test`,'$.id') FROM lnmp ORDER BY `json_obj_test`->'$.id';
    • SELECT `id`, `operator`, `json_obj_test`->'$.id' FROM lnmp ORDER BY `json_obj_test`->'$.id';
          • UPDATE lnmp SET `name`="Wyaooo" WHERE `json_obj_test`->'$.id' = 1541560547;

            嚴格控制變數的資料型別,string型別一定要加引號

  • JSON_SEARCH:【】
    • 'one': The search terminates after the first match and returns one path string. It is undefined which match is considered first.(返回匹配到的第一個元素的位置)
    • 'all': The search returns all matching path strings such that no duplicate paths are included. If there are multiple strings, they are autowrapped as an array. The order of the array elements is undefined.(返回匹配到的所有的元素的位置)

JSON_INSERT、JSON_REPLACE、JSON_SET三者的比較:

(1)JSON_SET()替換現有值,並新增新的值;

(2)JSON_INSERT()新增新值,但是並不會替換已經存在的值;

(3)JSON_REPLACE()只用來替換已經存在的值,否則不做操作。 

相關示例SQL語句如下:

DROP TABLE IF EXISTS `lnmp` ;
CREATE TABLE `lnmp` (
  `id`  INT(4) NOT NULL AUTO_INCREMENT,
  `operator` VARCHAR(8) NOT NULL DEFAULT '',
  `json_arr_test` JSON ,
  `json_obj_test` JSON ,
  PRIMARY KEY (`id`)
);
DESC `lnmp`;
SELECT * FROM lnmp;
INSERT INTO `lnmp` (`operator`, `json_arr_test`, `json_obj_test`) VALUES ('Mr.Wang',JSON_ARRAY(1,2),JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','這是第一條測試objcet的記錄'));
INSERT INTO `lnmp` (`operator`, `json_arr_test`, `json_obj_test`) VALUES ('Mr.Zhang',JSON_ARRAY(3,4),JSON_OBJECT('id',UNIX_TIMESTAMP(NOW()),'remark','大江東去浪淘盡'));
SELECT JSON_QUOTE('[1,2]');
SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS(`json_obj_test`,'["這是第一條測試objcet的記錄"]','$.remark');
SELECT `operator`, `json_arr_test` FROM lnmp WHERE JSON_CONTAINS_PATH(`json_obj_test`,'all','$.remark','$.b');
SELECT `id`, `operator`, JSON_EXTRACT(`json_obj_test`,'$.id') FROM lnmp ORDER BY `json_obj_test`->'$.id';
SELECT `id`, `operator`, `json_obj_test`->'$.id' FROM lnmp ORDER BY `json_obj_test`->'$.id';
ALTER TABLE `lnmp` ADD COLUMN `name` VARCHAR(8) DEFAULT '' COMMENT '操作人姓名' AFTER `operator`;
UPDATE lnmp SET `name`='wyaooo' WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_arr_test`=JSON_ARRAY_APPEND(`json_arr_test`,'$',JSON_OBJECT('code','01278923','name','Wyao')) WHERE `json_obj_test`->'$.id' = 1541560547;
SELECT JSON_KEYS(`json_obj_test`) FROM `lnmp` WHERE `json_obj_test`->'$.id' = 1541560547;
SELECT JSON_SEARCH(`json_arr_test`,'one','01278923') FROM lnmp;
UPDATE lnmp SET `json_arr_test` = JSON_ARRAY_INSERT(`json_arr_test`,'$[2]',JSON_OBJECT('course_code','02','course','Math')) WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_obj_test` = JSON_INSERT(`json_obj_test`,'$.id',012923,'$.status',1) WHERE `json_obj_test`->'$.id' = 1541560547;
UPDATE lnmp SET `json_arr_test` = JSON_MERGE_PRESERVE(`json_arr_test`->'$[0]',`json_arr_test`->'$[1]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_REMOVE(`json_arr_test`,'$[0]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_REPLACE(`json_arr_test`,'$[0]','[true, false]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_SET(`json_arr_test`,'$[0]','Wyao','$[1]','[true,false]') WHERE `json_obj_test`->'$.id' = 1541574430;
UPDATE lnmp SET `json_arr_test` = JSON_UNQUOTE(`json_arr_test`) WHERE `json_obj_test`->'$.id' = 1541574430;
SELECT `id`, `json_arr_test` FROM lnmp WHERE `json_obj_test`->'$.id' = 1541574430;
SELECT JSON_DEPTH(json_obj_test) FROM lnmp;
SELECT JSON_LENGTH(json_obj_test) FROM lnmp;
SELECT JSON_TYPE(json_arr_test) FROM lnmp;
SELECT JSON_VALID(json_arr_test) FROM lnmp;