1. 程式人生 > 其它 >【MySQL】JSON相關

【MySQL】JSON相關

JSON_ARRAY函式 ,返回一個JSON陣列,引數支援各種型別

mysql> SELECT JSON_ARRAY(1376, '字元', NULL, FALSE, NOW());
+-----------------------------------------------------------+
| JSON_ARRAY(1376, '字元', NULL, FALSE, NOW())              |
+-----------------------------------------------------------+
| [1376, "字元", null, false, "2021-07-09 10:47:33.000000"
] | +-----------------------------------------------------------+ 1 row in set (0.03 sec) mysql>

JSON_OBJECT函式,返回一個JSON物件,要求KV引數必須成雙入參

mysql> SELECT JSON_OBJECT('name', '張三', 'gender', TRUE, 'age', 24);
+--------------------------------------------------------+
| JSON_OBJECT('name', '張三', '
gender', TRUE, 'age', 24) | +--------------------------------------------------------+ | {"age": 24, "name": "張三", "gender": true} | +--------------------------------------------------------+ 1 row in set (0.03 sec) mysql>

JSON_QUOTE函式,追加雙引號修飾

JSON_QUOTE(json_val)

案例

mysql> SELECT
JSON_QUOTE('12321'), JSON_QUOTE('"12321"'), '12321',JSON_QUOTE('[1, 2, 3]'); +---------------------+-----------------------+-------+-------------------------+ | JSON_QUOTE('12321') | JSON_QUOTE('"12321"') | 12321 | JSON_QUOTE('[1, 2, 3]') | +---------------------+-----------------------+-------+-------------------------+ | "12321" | "\"12321\"" | 12321 | "[1, 2, 3]" | +---------------------+-----------------------+-------+-------------------------+ 1 row in set (0.02 sec) mysql>

JSON_UNQUOTE函式,移除雙引號修飾

JSON_QUOTE(json_val)

CONVERT函式,將JSON字串轉換為JSON

CONVERT(json_string,JSON)

案例

mysql> SELECT CONVERT('{"NAME": "MIKE", "AGE": 29, "GENDER": true}', JSON);
+--------------------------------------------------------------+
| CONVERT('{"NAME": "MIKE", "AGE": 29, "GENDER": true}', JSON) |
+--------------------------------------------------------------+
| {"AGE": 29, "NAME": "MIKE", "GENDER": true}                  |
+--------------------------------------------------------------+
1 row in set (0.02 sec)

mysql> 

JSON_CONTAINS函式

JSON_CONTAINS(json_doc, val[, path])

查詢json文件是否在指定path包含指定的資料,包含則返回1,否則返回0。

如果有引數為NULL或path不存在,則返回NULL。

-- 宣告一個JSON字串 
SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
-- 宣告一個1的變數
SET @j2 = '1';
-- 查詢JSON是否包含引數值函式(引數1 JSON字串, 引數2 Value值, 引數3 Key值[語法格式:'$.keyname'])
SELECT JSON_CONTAINS(@j, @j2, '$.a'); -- 查詢的是JSON物件的a屬性,a屬性的值是1,符合函式的包含條件,所以返回1表示結果TRUE
SELECT JSON_CONTAINS(@j, @j2, '$.b'); -- 查詢的是JSON物件的b屬性,a屬性的值是2,不符合函式包含條件,所以返回0表示結果FALSE

結果:

+-------------------------------+
| JSON_CONTAINS(@j, @j2, '$.a') |
+-------------------------------+
|                             1 |
+-------------------------------+
1 row in set (0.06 sec)

+-------------------------------+
| JSON_CONTAINS(@j, @j2, '$.b') |
+-------------------------------+
|                             0 |
+-------------------------------+
1 row in set (0.05 sec)

JSON_CONTAINS_PATH函式,查詢是否存在一個或多個K鍵

JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)

查詢是否存在指定路徑,存在則返回1,否則返回0。如果有引數為NULL,則返回NULL。

one_or_all只能取值"one"或"all",one表示只要有一個存在即可;all表示所有的都存在才行。

--  定義一個JSON字串
SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';

-- 查詢是否包含a鍵和e鍵,只要存在其中一個就返回1表示結果TRUE
SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e');

-- 查詢是否包含a鍵和e鍵,必須全部存在才返回1表示結果TRUE
SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e');

-- 查詢是否包含c鍵下面的d鍵,只要存在其中一個就返回1表示結果TRUE
SELECT JSON_CONTAINS_PATH(@j, 'one', '$.c.d');

-- 查詢是否包含a鍵下面的d鍵,只要存在其中一個就返回1表示結果TRUE
SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a.d');

JSON_EXTRACT抽取JSON資料

JSON_EXTRACT(json_doc, path[, path] ...)

從json文件裡抽取資料。如果有引數有NULL或path不存在,則返回NULL。

如果抽取出多個path,則返回的資料封閉在一個json array裡。

-- 抽取引數一的JSON陣列,取值是陣列的索引1
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');

-- 抽取多個,且合併成陣列返回
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]');

-- 抽取索引2的全部元素
SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');

在MySQL5.7.9版本中,支援使用【->】代替JSON_EXRACT表示

在MySQL5.7.13+版本中,支援使用【->>】代替JSON_EXRACT和JSON_UNQUOTE表示

語法演變:

JSON_UNQUOTE( JSON_EXTRACT(column, path) )
JSON_UNQUOTE(column -> path)
column->>path

JSON_KEYS 獲取指定K鍵下的所有K值

JSON_KEYS(json_doc[, path])

獲取json文件在指定路徑下的所有鍵值,返回一個json array。

如果有引數為NULL或path不存在,則返回NULL。

-- 直接對這個JSON物件獲取所有K鍵【無論是一個還是多個,返回的都是JSON陣列】
SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');

-- 獲取B鍵下的C鍵
SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}', '$.b');

JSON_SEARCH 查詢K鍵的索引

JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])

查詢包含指定字串的paths,並作為一個json array返回。

如果有引數為NUL或path不存在,則返回NULL。

one_or_all:"one"表示查詢到一個即返回;"all"表示查詢所有。

search_str:要查詢的字串。 可以用LIKE裡的'%'或‘_’匹配。

path:在指定path下查。

-- 宣告一個JSON陣列
SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';

-- 查詢字串‘abc’是否存在,如果不存在返回NULL,存在則返回所在的索引位置或者是K鍵名稱,引數'one'表示查詢第一個立刻返回(忽略後面相同的)
SELECT JSON_SEARCH(@j, 'one', 'abc');

-- 查詢字串‘abc’是否存在,如果不存在返回NULL,存在則返回所在的索引位置或者是K鍵名稱,引數'all'表示查詢JSON物件中所有的
SELECT JSON_SEARCH(@j, 'all', 'abc');