如今,越來越多的 IOT 設備被推廣使用,收集到的數(shù)據(jù),習慣性的,都會是 nosql 類型的,例如 JSON。
MariaDB 10.2.7 加入了 JSON 的數(shù)據(jù)類型,用于處理該格式的數(shù)據(jù),但在 MariaDB 10.2.3 已加入多個 JSON 用途 functions,支持所有文字型別字段 ( char, varchar, text …)。
此處簡單介紹下常用的 MariaDB 內(nèi)建的 JSON 相關的函數(shù)。
示例直接復制 MariaDB 命令窗口測試執(zhí)行語句及結(jié)果。
JSON_VALID
語法:
JSON_VALID(value)
說明:
顯示給定值是否為有效的 JSON 文檔(JSON document)。如果有效,則返回 1;如果無效,則返回 0;如果參數(shù)為空,則返回 NULL。
在 MariaDB 10.4.3 中,JSON_VALID 函數(shù)自動用作 JSON 數(shù)據(jù)類型別名的檢查約束,以確保插入有效的 JSON 文檔。即字段是 JSON 類型,則會自動檢查值是否為 JSON 格式。
示例:
MariaDB [(none)]> set @json1='{"id": 1, "name": "David"}';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> SELECT JSON_VALID(@json1);
+--------------------+
| JSON_VALID(@json1) |
+--------------------+
| 1 |
+--------------------+
1 row in set (0.000 sec)
或簡單寫成一句:
MariaDB [(none)]> SELECT JSON_VALID('{"id": 1, "name": " David "}');
+--------------------------------------------+
| JSON_VALID('{"id": 1, "name": " David "}') |
+--------------------------------------------+
| 1 |
+--------------------------------------------+
1 row in set (0.000 sec)
json 數(shù)據(jù)類型自動檢查:
-- 建表
CREATE TABLE test200222.jsont (
uid INTEGER UNSIGNED auto_increment NOT NULL,
uattr json NULL,
PRIMARY KEY (uid)
)
-- 插入測試
INSERT INTO jsont VALUES(1,NULL); -- Query OK, 1 row affected (0.01 sec)
INSERT INTO jsont VALUES(2,'{"size": 42, "colour": "white"}'); -- Query OK, 1 row affected (0.01 sec)
INSERT INTO jsont VALUES(3,'{"colour": "white}'); -- SQL 錯誤 [4025] [23000]: (conn=82) CONSTRAINT `jsont.uattr` failed for `test200222`.`jsont`
JSON_CONTAINS_PATH
語法:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
說明:
顯示給定的 JSON 文檔是否包含指定路徑處的數(shù)據(jù)。如果是,則返回 1;如果不是,則返回 0;如果任何參數(shù)為空,則返回 NULL。
返回參數(shù)可以是一個或全部:
- one-如果 JSON 文檔中至少存在一個路徑,則返回 1。
- all-僅當 JSON 文檔中存在所有路徑時返回 1。
path 路徑表示
- $. -> 起始
- $.key -> $.id —> { “id”: 5 }
- $.key.subkey -> $.data.subject -> { “data”: { “subject”:”h”} }
示例:
MariaDB [(none)]> SET @json = '{"A": 1, "B": [2], "C": [3, 4]}';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> SELECT JSON_CONTAINS_PATH(@json, 'one', '$.A', '$.D');
+------------------------------------------------+
| JSON_CONTAINS_PATH(@json, 'one', '$.A', '$.D') |
+------------------------------------------------+
| 1 |
+------------------------------------------------+
1 row in set (0.001 sec)
MariaDB [(none)]> SELECT JSON_CONTAINS_PATH(@json, 'all', '$.A', '$.D');
+------------------------------------------------+
| JSON_CONTAINS_PATH(@json, 'all', '$.A', '$.D') |
+------------------------------------------------+
| 0 |
+------------------------------------------------+
1 row in set (0.000 sec)
JSON_EXISTS
語法:
JSON_EXISTS(,)
說明
確定給定數(shù)據(jù)中是否存在指定的 JSON 值。如果找到,則返回 1;如果沒有,則返回 0;如果任何輸入為空,則返回 NULL。
示例:
MariaDB [(none)]> SELECT JSON_EXISTS('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2");
+------------------------------------------------------------+
| JSON_EXISTS('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2") |
+------------------------------------------------------------+
| 1 |
+------------------------------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_EXISTS('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[1]");
+---------------------------------------------------------------+
| JSON_EXISTS('{"key1":"xxxx", "key2":[1, 2, 3]}', "$.key2[1]") |
+---------------------------------------------------------------+
| 1 |
+---------------------------------------------------------------+
1 row in set (0.000 sec)
JSON_CONTAINS
語法:
JSON_CONTAINS(json_doc, val[, path])
說明:
返回指定的值是否在給定的 JSON 文檔中找到,或者是否在文檔中的指定路徑(可選)處找到。
- 如果是,則返回 1;如果不是,則返回 0;如果任何參數(shù)為空,則返回 NULL。
- 如果文檔或路徑無效,或包含或*通配符,則會發(fā)生錯誤。
示例:
MariaDB [(none)]> SET @json = '{"A": 0, "B": {"C": 1}, "D": 2}';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> SELECT JSON_CONTAINS(@json, '2', '$.A');
+----------------------------------+
| JSON_CONTAINS(@json, '2', '$.A') |
+----------------------------------+
| 0 |
+----------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_CONTAINS(@json, '2', '$.D');
+----------------------------------+
| JSON_CONTAINS(@json, '2', '$.D') |
+----------------------------------+
| 1 |
+----------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_CONTAINS(@json, '{"C": 1}', '$.A');
+-----------------------------------------+
| JSON_CONTAINS(@json, '{"C": 1}', '$.A') |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_CONTAINS(@json, '{"C": 1}', '$.B');
+-----------------------------------------+
| JSON_CONTAINS(@json, '{"C": 1}', '$.B') |
+-----------------------------------------+
| 1 |
+-----------------------------------------+
1 row in set (0.000 sec)
JSON_DEPTH
語法:
JSON_DEPTH(json_doc)
說明:
返回給定 JSON 文檔的最大深度,如果參數(shù)為 NULL,則返回 NULL。如果參數(shù)是無效的 JSON 文檔,則會發(fā)生錯誤。
標量值(scalar values)或空數(shù)組或?qū)ο蟮纳疃葹?1。
非空但僅包含深度為 1 的元素或成員值的數(shù)組或?qū)ο蟮纳疃葹?2。
在其它情況下,深度將大于 2。
示例:
MariaDB [(none)]> SELECT JSON_DEPTH('[]'), JSON_DEPTH('true'), JSON_DEPTH('{}');
+------------------+--------------------+------------------+
| JSON_DEPTH('[]') | JSON_DEPTH('true') | JSON_DEPTH('{}') |
+------------------+--------------------+------------------+
| 1 | 1 | 1 |
+------------------+--------------------+------------------+
1 row in set (0.043 sec)
MariaDB [(none)]> SELECT JSON_DEPTH('[1, 2, 3]'), JSON_DEPTH('[[], {}, []]');
+-------------------------+----------------------------+
| JSON_DEPTH('[1, 2, 3]') | JSON_DEPTH('[[], {}, []]') |
+-------------------------+----------------------------+
| 2 | 2 |
+-------------------------+----------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_DEPTH('[1, 2, [3, 4, 5, 6], 7]');
+---------------------------------------+
| JSON_DEPTH('[1, 2, [3, 4, 5, 6], 7]') |
+---------------------------------------+
| 3 |
+---------------------------------------+
1 row in set (0.000 sec)
JSON_OBJECT
語法:
JSON_OBJECT([key, value[, key, value] ...])
說明:
返回包含給定鍵/值對的 JSON 對象。鍵/值列表可以為空。
如果參數(shù)的數(shù)目為奇數(shù),或者任何鍵名為空,則將發(fā)生錯誤。
示例:
MariaDB [(none)]> SELECT JSON_OBJECT("id", 1, "name", "David");
+---------------------------------------+
| JSON_OBJECT("id", 1, "name", "David") |
+---------------------------------------+
| {"id": 1, "name": "David"} |
+---------------------------------------+
1 row in set (0.000 sec)
JSON_KEYS
語法:
JSON_KEYS(json_doc[, path])
說明:
從 JSON 對象的頂層值(top-level value)以 JSON 數(shù)組的形式返回鍵,如果提供了可選的 path 參數(shù),則從 path 返回頂層鍵(top-level keys)。
從頂層值中的嵌套子對象中排除關鍵幀。如果所選對象為空,則生成的數(shù)組將為空。
如果任何參數(shù)為空、給定路徑未找到對象或 json_doc 參數(shù)不是對象,則返回 NULL。
如果 JSON 文檔無效、路徑無效或路徑包含或*通配符,則會發(fā)生錯誤。
示例:
MariaDB [(none)]> SELECT JSON_KEYS('{"A": 1, "B": {"C": 2}}');
+--------------------------------------+
| JSON_KEYS('{"A": 1, "B": {"C": 2}}') |
+--------------------------------------+
| ["A", "B"] |
+--------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_KEYS('{"A": 1, "B": 2, "C": {"D": 3}}', '$.C');
+-----------------------------------------------------+
| JSON_KEYS('{"A": 1, "B": 2, "C": {"D": 3}}', '$.C') |
+-----------------------------------------------------+
| ["D"] |
+-----------------------------------------------------+
1 row in set (0.000 sec)
JSON_VALUE
語法:
JSON_VALUE(json_doc, path)
說明:
給定一個 JSON 文檔,返回路徑指定的標量(scalar)。如果沒有給出有效的 JSON 文檔,或者沒有匹配項,則返回 NULL。
示例:
MariaDB [(none)]> select json_value('{"key1":123}', '$.key1');
+--------------------------------------+
| json_value('{"key1":123}', '$.key1') |
+--------------------------------------+
| 123 |
+--------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> select json_value('{"key1": [1,2,3], "key1":123}', '$.key1');
+-------------------------------------------------------+
| json_value('{"key1": [1,2,3], "key1":123}', '$.key1') |
+-------------------------------------------------------+
| 123 |
+-------------------------------------------------------+
1 row in set (0.000 sec)
JSON_INSERT
語法:
JSON_INSERT(json_doc, path, val[, path, val] ...)
說明:
將數(shù)據(jù)插入到 JSON 文檔中,如果任何參數(shù)為 NULL,則返回結(jié)果文檔或 NULL。
如果 JSON 文檔不是無效的,或者如果任何路徑無效或包含或*通配符,則會發(fā)生錯誤。
JSON_INSERT 只能插入數(shù)據(jù),而 JSON_REPLACE 只能更新。JSON_SET 可以更新或插入數(shù)據(jù)。
示例:
MariaDB [(none)]> SET @json = '{ "A": 0, "B": [1, 2]}';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> SELECT JSON_INSERT(@json, '$.C', '[3, 4]');
+--------------------------------------+
| JSON_INSERT(@json, '$.C', '[3, 4]') |
+--------------------------------------+
| {"A": 0, "B": [1, 2], "C": "[3, 4]"} |
+--------------------------------------+
1 row in set (0.000 sec)
JSON_REPLACE
語法:
JSON_REPLACE(json_doc, path, val[, path, val] ...)
說明:
替換 JSON 文檔中的現(xiàn)有值,返回結(jié)果;如果任何參數(shù)為空,則為空。
如果 JSON 文檔無效、路徑無效或路徑包含或*通配符,則會發(fā)生錯誤。
路徑和值是從左到右計算的,前面的計算結(jié)果將用作下一個的值
示例:
MariaDB [(none)]> SELECT JSON_REPLACE('{ "A": 1, "B": [2, 3]}', '$.B[1]', 4);
+-----------------------------------------------------+
| JSON_REPLACE('{ "A": 1, "B": [2, 3]}', '$.B[1]', 4) |
+-----------------------------------------------------+
| {"A": 1, "B": [2, 4]} |
+-----------------------------------------------------+
1 row in set (0.000 sec)
JSON_SET
語法:
JSON_SET(json_doc, path, val[, path, val] ...)
說明:
在 JSON 文檔中更新或插入數(shù)據(jù),返回結(jié)果;如果任何參數(shù)為 NULL 或可選路徑找不到對象,則返回 NULL。
如果 JSON 文檔無效、路徑無效或路徑包含*或通配符,則會發(fā)生錯誤。
示例:
MariaDB [(none)]> SET @json = '{"A": 0, "B": "hello", "C": {"msg": "check"} }';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> SELECT JSON_VALID(@json);
+-------------------+
| JSON_VALID(@json) |
+-------------------+
| 1 |
+-------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_SET(@json , '$.B' , '"WORLD"');
+---------------------------------------------------+
| JSON_SET(@json , '$.B' , '"WORLD"') |
+---------------------------------------------------+
| {"A": 0, "B": "\"WORLD\"", "C": {"msg": "check"}} |
+---------------------------------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_SET(@json , '$.D' , '"INSERT"');
+------------------------------------------------------------------+
| JSON_SET(@json , '$.D' , '"INSERT"') |
+------------------------------------------------------------------+
| {"A": 0, "B": "hello", "C": {"msg": "check"}, "D": "\"INSERT\""} |
+------------------------------------------------------------------+
1 row in set (0.000 sec)
JSON_EXTRACT
語法:
JSON_EXTRACT(json_doc, path[, path] ...)
說明:
從 JSON 文檔中提取數(shù)據(jù)。從與路徑參數(shù)匹配的部分中選擇提取的數(shù)據(jù)。返回所有匹配的值。要么作為單個匹配的值,要么在參數(shù)可以返回多個值的情況下,則結(jié)果將自動包裝為匹配順序的數(shù)組。
如果沒有匹配的路徑或任何參數(shù)為空,則返回 NULL。
如果任何 path 參數(shù)不是有效的 path,或者 json_doc 參數(shù)不是有效的 json 文檔,則會發(fā)生錯誤。
示例:
MariaDB [(none)]> SET @json = '[1, 2, [3, 4]]';
Query OK, 0 rows affected (0.000 sec)
MariaDB [(none)]> SELECT JSON_EXTRACT(@json, '$[1]');
+-----------------------------+
| JSON_EXTRACT(@json, '$[1]') |
+-----------------------------+
| 2 |
+-----------------------------+
1 row in set (0.000 sec)
MariaDB [(none)]> SELECT JSON_EXTRACT(@json, '$[2]');
+-----------------------------+
| JSON_EXTRACT(@json, '$[2]') |
+-----------------------------+
| [3, 4] |
+-----------------------------+
1 row in set (0.001 sec)
MariaDB [(none)]> SELECT JSON_EXTRACT(@json, '$[2][1]');
+--------------------------------+
| JSON_EXTRACT(@json, '$[2][1]') |
+--------------------------------+
| 4 |
+--------------------------------+
1 row in set (0.000 sec)
更多 MariaDB 內(nèi)建 JSON 函數(shù),可參看官網(wǎng):https://mariadb.com/kb/en/json-functions/