(十六)MariaDB部分內(nèi)置JSON函數(shù)簡介

如今,越來越多的 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/

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容