久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

mysql json 函數(shù)

 小世界的野孩子 2022-03-12

12.17.1 JSON函數(shù)參考

表12.21 JSON函數(shù)

Name描述
->評估路徑后從JSON列返回值,;等效于JSON_EXTRACT(),。
->> (介紹5.7.13)評估路徑并取消引用結(jié)果后,,從JSON列返回值,;等效于JSON_UNQUOTE(JSON_EXTRACT())。
JSON_APPEND() (已棄用)將數(shù)據(jù)附加到JSON文檔
JSON_ARRAY()創(chuàng)建JSON數(shù)組
JSON_ARRAY_APPEND()將數(shù)據(jù)附加到JSON文檔
JSON_ARRAY_INSERT()插入JSON數(shù)組
JSON_CONTAINS()JSON文檔是否在路徑中包含特定對象
JSON_CONTAINS_PATH()JSON文檔是否在路徑中包含任何數(shù)據(jù)
JSON_DEPTH()JSON文檔的最大深度
JSON_EXTRACT()從JSON文檔返回數(shù)據(jù)
JSON_INSERT()將數(shù)據(jù)插入JSON文檔
JSON_KEYS()JSON文檔中的鍵數(shù)組
JSON_LENGTH()JSON文檔中的元素數(shù)
JSON_MERGE() (不建議使用5.7.22)合并JSON文檔,,保留重復(fù)的鍵,。JSON_MERGE_PRESERVE()的已棄用同義詞
JSON_MERGE_PATCH() (介紹5.7.22)合并JSON文檔,替換重復(fù)鍵的值
JSON_MERGE_PRESERVE() (介紹5.7.22)合并JSON文檔,,保留重復(fù)的鍵
JSON_OBJECT()創(chuàng)建JSON對象
JSON_PRETTY() (介紹5.7.22)以易于閱讀的格式打印JSON文檔
JSON_QUOTE()引用JSON文檔
JSON_REMOVE()從JSON文檔中刪除數(shù)據(jù)
JSON_REPLACE()替換JSON文檔中的值
JSON_SEARCH()JSON文檔中值的路徑
JSON_SET()將數(shù)據(jù)插入JSON文檔
JSON_STORAGE_SIZE() (介紹5.7.22)用于存儲JSON文檔的二進制表示的空間
JSON_TYPE()JSON值類型
JSON_UNQUOTE()取消引用JSON值
JSON_VALID()JSON值是否有效

MySQL 5.7.22和更高版本支持兩個聚合JSON函數(shù) JSON_ARRAYAGG()JSON_OBJECTAGG()。有關(guān)這些功能的說明,,請參見 第12.20節(jié)“集合函數(shù)”,。

同樣從MySQL 5.7.22開始:

  • 可以使用該JSON_PRETTY()函數(shù)以易于讀取的格式對JSON值進行 “ 漂亮打印 ”。

  • 您可以使用看到給定JSON值占用了多少存儲空間JSON_STORAGE_SIZE(),。

有關(guān)這兩個函數(shù)的完整說明,,請參見 第12.17.6節(jié)“ JSON實用程序函數(shù)”

12.17.2創(chuàng)建JSON值的函數(shù)

本節(jié)中列出的功能由組件元素組成JSON值,。

  • JSON_ARRAY([val[, val\] ...])

    評估(可能為空)值列表,,并返回包含這些值的JSON數(shù)組。

    mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());
    +---------------------------------------------+
    | JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()) |
    +---------------------------------------------+
    | [1, "abc", null, true, "11:30:24.000000"]   |
    +---------------------------------------------+
  • JSON_OBJECT([key, val[, key, val\] ...])

    評估鍵值對的列表(可能為空),,并返回包含這些對的JSON對象,。如果任何鍵名是NULL或參數(shù)個數(shù)是奇數(shù),則會發(fā)生錯誤,。

    mysql> SELECT JSON_OBJECT('id', 87, 'name', 'carrot');
    +-----------------------------------------+
    | JSON_OBJECT('id', 87, 'name', 'carrot') |
    +-----------------------------------------+
    | {"id": 87, "name": "carrot"}            |
    +-----------------------------------------+
  • JSON_QUOTE(string)

    通過將字符串用雙引號引起來并轉(zhuǎn)義內(nèi)部引號和其他字符來將utf8mb4字符串引為JSON值,,然后將結(jié)果作為字符串返回 。NULL如果參數(shù)為,,則 返回 NULL,。

    此函數(shù)通常用于生成有效的JSON字符串文字,以包含在JSON文檔中,。

    根據(jù)表12.22“ JSON_UNQUOTE()特殊字符轉(zhuǎn)義序列”中所示的轉(zhuǎn)義序列,,使用反斜杠對某些特殊字符進行轉(zhuǎn)義 。

    mysql> SELECT JSON_QUOTE('null'), JSON_QUOTE('"null"');
    +--------------------+----------------------+
    | JSON_QUOTE('null') | JSON_QUOTE('"null"') |
    +--------------------+----------------------+
    | "null"             | "\"null\""           |
    +--------------------+----------------------+
    mysql> SELECT JSON_QUOTE('[1, 2, 3]');
    +-------------------------+
    | JSON_QUOTE('[1, 2, 3]') |
    +-------------------------+
    | "[1, 2, 3]"             |
    +-------------------------+

您還可以通過JSON使用將其他類型的值強制轉(zhuǎn)換為該類型來 獲取JSON值,。有關(guān)更多信息,,請參見 在JSON和非JSON值之間轉(zhuǎn)換CAST(value AS JSON)

提供了兩個生成JSON值的聚合函數(shù)(MySQL 5.7.22和更高版本),。 JSON_ARRAYAGG()返回結(jié)果集作為單個JSON數(shù)組,,并 JSON_OBJECTAGG()返回結(jié)果集作為單個JSON對象。有關(guān)更多信息,,請參見 第12.20節(jié)“聚合函數(shù)”,。

12.17.3搜索JSON值的函數(shù)

本節(jié)中的函數(shù)對JSON值執(zhí)行搜索操作,以從中提取數(shù)據(jù),,報告數(shù)據(jù)是否在其中的某個位置或報告其中的數(shù)據(jù)的路徑,。

  • JSON_CONTAINS(target, candidate[, path\])

    通過返回1或0來指示給定的candidateJSON文檔是否包含在targetJSON文檔中,,或者(如果提供了path 參數(shù))指示是否 在目標內(nèi)的特定路徑上找到了候選對象。返回 NULL是否有任何參數(shù)是 NULL,,或者path參數(shù)沒有標識目標文檔的一部分,。如果target或 candidate不是有效的JSON文檔,或者path參數(shù)不是有效的路徑表達式或包含 `或通配符,,則會發(fā)生錯誤 ,。

    要僅檢查路徑上是否存在任何數(shù)據(jù),請 JSON_CONTAINS_PATH()改用,。

    以下規(guī)則定義了圍堵:

    否則,,候選值將不包含在目標文檔中。

    mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
    mysql> SET @j2 = '1';
    mysql> SELECT JSON_CONTAINS(@j, @j2, '$.a');
    +-------------------------------+
    | JSON_CONTAINS(@j, @j2, '$.a') |
    +-------------------------------+
    |                             1 |
    +-------------------------------+
    mysql> SELECT JSON_CONTAINS(@j, @j2, '$.b');
    +-------------------------------+
    | JSON_CONTAINS(@j, @j2, '$.b') |
    +-------------------------------+
    |                             0 |
    +-------------------------------+
    
    mysql> SET @j2 = '{"d": 4}';
    mysql> SELECT JSON_CONTAINS(@j, @j2, '$.a');
    +-------------------------------+
    | JSON_CONTAINS(@j, @j2, '$.a') |
    +-------------------------------+
    |                             0 |
    +-------------------------------+
    mysql> SELECT JSON_CONTAINS(@j, @j2, '$.c');
    +-------------------------------+
    | JSON_CONTAINS(@j, @j2, '$.c') |
    +-------------------------------+
    |                             1 |
    +-------------------------------+
    • 當且僅當候選標量可比較且相等時,,才包含在目標標量中,。如果兩個標量值具有相同的JSON_TYPE()類型,則它們是可比較的,,但 類型的值INTEGERDECIMAL也可彼此比較,。

    • 當且僅當候選對象中的每個元素都包含在目標的某個元素中時,候選數(shù)組才包含在目標數(shù)組中,。

    • 當且僅當候選非數(shù)組包含在目標的某個元素中時,,該候選非數(shù)組才包含在目標數(shù)組中。

    • 當且僅當候選對象中的每個關(guān)鍵字在目標中存在一個具有相同名稱的關(guān)鍵字并且與候選關(guān)鍵字相關(guān)聯(lián)的值包含在與目標關(guān)鍵字相關(guān)聯(lián)的值中時,,候選對象才包含在目標對象中,。

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

    返回0或1以指示JSON文檔是否包含給定路徑中的數(shù)據(jù)。返回NULL 是否有任何參數(shù)NULL,。如果json_doc參數(shù)不是有效的JSON文檔,,任何path 參數(shù)不是有效的路徑表達式,或者 one_or_all不是 'one'或,,都會發(fā)生錯誤'all',。

    要檢查路徑上的特定值,請 JSON_CONTAINS()改用,。

    如果文檔中沒有指定的路徑,,則返回值為0。否則,,返回值取決于 one_or_all參數(shù):

    mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e');
    +---------------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'one', '$.a', '$.e') |
    +---------------------------------------------+
    |                                           1 |
    +---------------------------------------------+
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e');
    +---------------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'all', '$.a', '$.e') |
    +---------------------------------------------+
    |                                           0 |
    +---------------------------------------------+
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.c.d');
    +----------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'one', '$.c.d') |
    +----------------------------------------+
    |                                      1 |
    +----------------------------------------+
    mysql> SELECT JSON_CONTAINS_PATH(@j, 'one', '$.a.d');
    +----------------------------------------+
    | JSON_CONTAINS_PATH(@j, 'one', '$.a.d') |
    +----------------------------------------+
    |                                      0 |
    +----------------------------------------+
    • 'one':如果文檔中至少存在一個路徑,,則為1,否則為0,。

    • 'all':如果文檔中存在所有路徑,,則為1,否則為0,。

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

    從JSON文檔中返回數(shù)據(jù),,該數(shù)據(jù)是從與path 參數(shù)匹配的文檔部分中選擇的,。返回NULL是否有任何參數(shù) NULL在文檔中找到值的路徑。如果json_doc參數(shù)不是有效的JSON文檔或任何path參數(shù)不是有效的路徑表達式,,則會發(fā)生錯誤 ,。

    返回值由path參數(shù)匹配的所有值組成 。如果這些參數(shù)有可能返回多個值,,則匹配的值將按照與生成它們的路徑相對應(yīng)的順序自動包裝為數(shù)組,。否則,返回值是單個匹配值,。

    mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');
    +--------------------------------------------+
    | JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]') |
    +--------------------------------------------+
    | 20                                         |
    +--------------------------------------------+
    mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]');
    +----------------------------------------------------+
    | JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]', '$[0]') |
    +----------------------------------------------------+
    | [20, 10]                                           |
    +----------------------------------------------------+
    mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');
    +-----------------------------------------------+
    | JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]') |
    +-----------------------------------------------+
    | [30, 40]                                      |
    +-----------------------------------------------+

    MySQL 5.7.9和更高版本支持 -> 此函數(shù)的快捷方式,,與2個參數(shù)一起使用,其中左側(cè)是 JSON列標識符(不是表達式),,右側(cè)是要在列中匹配的JSON路徑,。

  • column->path

    在MySQL 5.7.9及更高版本中,,與兩個參數(shù)一起使用時,,該 -> 運算符充當JSON_EXTRACT()函數(shù)的別名 ,兩個參數(shù)分別是左側(cè)的列標識符和右側(cè)的JSON路徑(針對JSON文檔(列值)進行評估),。您可以在SQL語句中的任何位置使用此類表達式代替列標識符,。

    SELECT此處顯示 的兩個語句產(chǎn)生相同的輸出:

    mysql> SELECT c, JSON_EXTRACT(c, "$.id"), g
         > FROM jemp
         > WHERE JSON_EXTRACT(c, "$.id") > 1
         > ORDER BY JSON_EXTRACT(c, "$.name");
    +-------------------------------+-----------+------+
    | c                             | c->"$.id" | g    |
    +-------------------------------+-----------+------+
    | {"id": "3", "name": "Barney"} | "3"       |    3 |
    | {"id": "4", "name": "Betty"}  | "4"       |    4 |
    | {"id": "2", "name": "Wilma"}  | "2"       |    2 |
    +-------------------------------+-----------+------+
    3 rows in set (0.00 sec)
    
    mysql> SELECT c, c->"$.id", g
         > FROM jemp
         > WHERE c->"$.id" > 1
         > ORDER BY c->"$.name";
    +-------------------------------+-----------+------+
    | c                             | c->"$.id" | g    |
    +-------------------------------+-----------+------+
    | {"id": "3", "name": "Barney"} | "3"       |    3 |
    | {"id": "4", "name": "Betty"}  | "4"       |    4 |
    | {"id": "2", "name": "Wilma"}  | "2"       |    2 |
    +-------------------------------+-----------+------+
    3 rows in set (0.00 sec)

    此功能不限于 SELECT,如下所示:

    mysql> ALTER TABLE jemp ADD COLUMN n INT;
    Query OK, 0 rows affected (0.68 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> UPDATE jemp SET n=1 WHERE c->"$.id" = "4";
    Query OK, 1 row affected (0.04 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT c, c->"$.id", g, n
         > FROM jemp
         > WHERE JSON_EXTRACT(c, "$.id") > 1
         > ORDER BY c->"$.name";
    +-------------------------------+-----------+------+------+
    | c                             | c->"$.id" | g    | n    |
    +-------------------------------+-----------+------+------+
    | {"id": "3", "name": "Barney"} | "3"       |    3 | NULL |
    | {"id": "4", "name": "Betty"}  | "4"       |    4 |    1 |
    | {"id": "2", "name": "Wilma"}  | "2"       |    2 | NULL |
    +-------------------------------+-----------+------+------+
    3 rows in set (0.00 sec)
    
    mysql> DELETE FROM jemp WHERE c->"$.id" = "4";
    Query OK, 1 row affected (0.04 sec)
    
    mysql> SELECT c, c->"$.id", g, n
         > FROM jemp
         > WHERE JSON_EXTRACT(c, "$.id") > 1
         > ORDER BY c->"$.name";
    +-------------------------------+-----------+------+------+
    | c                             | c->"$.id" | g    | n    |
    +-------------------------------+-----------+------+------+
    | {"id": "3", "name": "Barney"} | "3"       |    3 | NULL |
    | {"id": "2", "name": "Wilma"}  | "2"       |    2 | NULL |
    +-------------------------------+-----------+------+------+
    2 rows in set (0.00 sec)

    (有關(guān)用于創(chuàng)建和填充剛剛顯示的表的語句,,請參見索引生成的列以提供JSON列索引,。)

    這也適用于JSON數(shù)組值,如下所示:

    mysql> CREATE TABLE tj10 (a JSON, b INT);
    Query OK, 0 rows affected (0.26 sec)
    
    mysql> INSERT INTO tj10
         > VALUES ("[3,10,5,17,44]", 33), ("[3,10,5,17,[22,44,66]]", 0);
    Query OK, 1 row affected (0.04 sec)
    
    mysql> SELECT a->"$[4]" FROM tj10;
    +--------------+
    | a->"$[4]"    |
    +--------------+
    | 44           |
    | [22, 44, 66] |
    +--------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT * FROM tj10 WHERE a->"$[0]" = 3;
    +------------------------------+------+
    | a                            | b    |
    +------------------------------+------+
    | [3, 10, 5, 17, 44]           |   33 |
    | [3, 10, 5, 17, [22, 44, 66]] |    0 |
    +------------------------------+------+
    2 rows in set (0.00 sec)

    支持嵌套數(shù)組,。使用的表達式的 ->求值就像NULL 在目標JSON文檔中找不到匹配的鍵一樣,,如下所示:

    mysql> SELECT * FROM tj10 WHERE a->"$[4][1]" IS NOT NULL;
    +------------------------------+------+
    | a                            | b    |
    +------------------------------+------+
    | [3, 10, 5, 17, [22, 44, 66]] |    0 |
    +------------------------------+------+
    
    mysql> SELECT a->"$[4][1]" FROM tj10;
    +--------------+
    | a->"$[4][1]" |
    +--------------+
    | NULL         |
    | 44           |
    +--------------+
    2 rows in set (0.00 sec)

    這與在使用JSON_EXTRACT()以下情況時看到的行為相同 :

    mysql> SELECT JSON_EXTRACT(a, "$[4][1]") FROM tj10;
    +----------------------------+
    | JSON_EXTRACT(a, "$[4][1]") |
    +----------------------------+
    | NULL                       |
    | 44                         |
    +----------------------------+
    2 rows in set (0.00 sec)
  • column->>path

    這是MySQL 5.7.13和更高版本中提供的一種改進的,取消引用的提取運算符,。而 ->操作者簡單地提取的值時,, ->>在加法運算unquotes提取結(jié)果。換句話說,,給定一個 JSON列值 column和一個路徑表達式 path,,以下三個表達式返回相同的值:

    ->>可以JSON_UNQUOTE(JSON_EXTRACT())在允許的任何地方使用 該運算符 。這包括(但不限于) SELECT列表,,WHEREHAVING條款,,并ORDER BYGROUP BY條款。

    接下來的幾條語句演示了->>mysql客戶端中其他表達式的一些 運算符等效項:

    mysql> SELECT * FROM jemp WHERE g > 2;
    +-------------------------------+------+
    | c                             | g    |
    +-------------------------------+------+
    | {"id": "3", "name": "Barney"} |    3 |
    | {"id": "4", "name": "Betty"}  |    4 |
    +-------------------------------+------+
    2 rows in set (0.01 sec)
    
    mysql> SELECT c->'$.name' AS name
        ->     FROM jemp WHERE g > 2;
    +----------+
    | name     |
    +----------+
    | "Barney" |
    | "Betty"  |
    +----------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT JSON_UNQUOTE(c->'$.name') AS name
        ->     FROM jemp WHERE g > 2;
    +--------+
    | name   |
    +--------+
    | Barney |
    | Betty  |
    +--------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT c->>'$.name' AS name
        ->     FROM jemp WHERE g > 2;
    +--------+
    | name   |
    +--------+
    | Barney |
    | Betty  |
    +--------+
    2 rows in set (0.00 sec)

    請參閱為已生成的列編制索引以提供JSON列索引,,以獲取用于jemp在剛剛顯示的示例集中創(chuàng)建和填充表的SQL語句 ,。

    此運算符也可以與JSON數(shù)組一起使用,如下所示:

    mysql> CREATE TABLE tj10 (a JSON, b INT);
    Query OK, 0 rows affected (0.26 sec)
    
    mysql> INSERT INTO tj10 VALUES
        ->     ('[3,10,5,"x",44]', 33),
        ->     ('[3,10,5,17,[22,"y",66]]', 0);
    Query OK, 2 rows affected (0.04 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> SELECT a->"$[3]", a->"$[4][1]" FROM tj10;
    +-----------+--------------+
    | a->"$[3]" | a->"$[4][1]" |
    +-----------+--------------+
    | "x"       | NULL         |
    | 17        | "y"          |
    +-----------+--------------+
    2 rows in set (0.00 sec)
    
    mysql> SELECT a->>"$[3]", a->>"$[4][1]" FROM tj10;
    +------------+---------------+
    | a->>"$[3]" | a->>"$[4][1]" |
    +------------+---------------+
    | x          | NULL          |
    | 17         | y             |
    +------------+---------------+
    2 rows in set (0.00 sec)

    與一樣 ->,,->>運算符總是在的輸出中擴展EXPLAIN,,如以下示例所示:

    mysql> EXPLAIN SELECT c->>'$.name' AS name
        ->     FROM jemp WHERE g > 2\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: jemp
       partitions: NULL
             type: range
    possible_keys: i
              key: i
          key_len: 5
              ref: NULL
             rows: 2
         filtered: 100.00
            Extra: Using where
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Note
       Code: 1003
    Message: /* select#1 */ select
    json_unquote(json_extract(`jtest`.`jemp`.`c`,'$.name')) AS `name` from
    `jtest`.`jemp` where (`jtest`.`jemp`.`g` > 2)
    1 row in set (0.00 sec)

    這類似于MySQL -> 在相同情況下擴展 運算符的方式,。

    ->>操作符是在MySQL 5.7.13中添加的。

  • JSON_KEYS(json_doc[, path\])

    以JSON數(shù)組的形式返回JSON對象的頂級值中的鍵,,或者,,如果提供了path 參數(shù),則返回所選路徑中的頂級鍵,。NULL如果任何參數(shù)是 NULL,,則返回,該 json_doc參數(shù)不是對象,,或者path如果給定,,則不定位對象。如果json_doc參數(shù)不是有效的JSON文檔,,或者path參數(shù)不是有效的路徑表達式或包含 `或通配符,,則會發(fā)生錯誤 。

    如果所選對象為空,,則結(jié)果數(shù)組為空,。如果頂級值具有嵌套的子對象,則返回值不包含來自那些子對象的鍵,。

    mysql> SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}');
    +---------------------------------------+
    | JSON_KEYS('{"a": 1, "b": {"c": 30}}') |
    +---------------------------------------+
    | ["a", "b"]                            |
    +---------------------------------------+
    mysql> SELECT JSON_KEYS('{"a": 1, "b": {"c": 30}}', '$.b');
    +----------------------------------------------+
    | JSON_KEYS('{"a": 1, "b": {"c": 30}}', '$.b') |
    +----------------------------------------------+
    | ["c"]                                        |
    +----------------------------------------------+
  • JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path\] ...])

    返回JSON文檔中給定字符串的路徑,。NULL如果任何一個,或 參數(shù)為 json_doc,, 則 返回,; 文件內(nèi)不存在;或 找不到,。如果參數(shù)不是有效的JSON文檔,,任何 參數(shù)不是有效的路徑表達式, 不是 或或 不是常數(shù)表達式,,都會發(fā)生錯誤,。 search_strpathNULLpathsearch_strjson_docpathone_or_all'one'``'all'escape_char

    該one_or_all參數(shù)影響搜索,如下所示:

    在search_str搜索字符串參數(shù)中,,%_ 字符與LIKE 運算符的作用相同:%匹配任意數(shù)量的字符(包括零個字符),,并 _精確匹配一個字符。

    要在搜索字符串中指定文字%_字符,,請在其前面加上轉(zhuǎn)義字符,。默認值是 \,如果 escape_char參數(shù)丟失或 NULL,。否則,, escape_char必須為空或一個字符的常量。

    有關(guān)匹配和轉(zhuǎn)義字符行為的詳細信息,,請參閱的說明 LIKE12.7.1節(jié),,“字符串比較函數(shù)和操作符”,。對于轉(zhuǎn)義字符處理,與LIKE行為的區(qū)別 在于,,轉(zhuǎn)義字符JSON_SEARCH() 必須在編譯時而不是僅在執(zhí)行時求值為常數(shù),。例如,如果 JSON_SEARCH()在準備好的語句中 escape_char使用并且?參數(shù)使用參數(shù)提供,,則參數(shù)值在執(zhí)行時可能是恒定的,,但在編譯時卻不是。

    mysql> SET @j = '["abc", [{"k": "10"}, "def"], {"x":"abc"}, {"y":"bcd"}]';
    
    mysql> SELECT JSON_SEARCH(@j, 'one', 'abc');
    +-------------------------------+
    | JSON_SEARCH(@j, 'one', 'abc') |
    +-------------------------------+
    | "$[0]"                        |
    +-------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', 'abc');
    +-------------------------------+
    | JSON_SEARCH(@j, 'all', 'abc') |
    +-------------------------------+
    | ["$[0]", "$[2].x"]            |
    +-------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', 'ghi');
    +-------------------------------+
    | JSON_SEARCH(@j, 'all', 'ghi') |
    +-------------------------------+
    | NULL                          |
    +-------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '10');
    +------------------------------+
    | JSON_SEARCH(@j, 'all', '10') |
    +------------------------------+
    | "$[1][0].k"                  |
    +------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$');
    +-----------------------------------------+
    | JSON_SEARCH(@j, 'all', '10', NULL, '$') |
    +-----------------------------------------+
    | "$[1][0].k"                             |
    +-----------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[*]');
    +--------------------------------------------+
    | JSON_SEARCH(@j, 'all', '10', NULL, '$[*]') |
    +--------------------------------------------+
    | "$[1][0].k"                                |
    +--------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$**.k');
    +---------------------------------------------+
    | JSON_SEARCH(@j, 'all', '10', NULL, '$**.k') |
    +---------------------------------------------+
    | "$[1][0].k"                                 |
    +---------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[*][0].k');
    +-------------------------------------------------+
    | JSON_SEARCH(@j, 'all', '10', NULL, '$[*][0].k') |
    +-------------------------------------------------+
    | "$[1][0].k"                                     |
    +-------------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[1]');
    +--------------------------------------------+
    | JSON_SEARCH(@j, 'all', '10', NULL, '$[1]') |
    +--------------------------------------------+
    | "$[1][0].k"                                |
    +--------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '10', NULL, '$[1][0]');
    +-----------------------------------------------+
    | JSON_SEARCH(@j, 'all', '10', NULL, '$[1][0]') |
    +-----------------------------------------------+
    | "$[1][0].k"                                   |
    +-----------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', 'abc', NULL, '$[2]');
    +---------------------------------------------+
    | JSON_SEARCH(@j, 'all', 'abc', NULL, '$[2]') |
    +---------------------------------------------+
    | "$[2].x"                                    |
    +---------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '%a%');
    +-------------------------------+
    | JSON_SEARCH(@j, 'all', '%a%') |
    +-------------------------------+
    | ["$[0]", "$[2].x"]            |
    +-------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '%b%');
    +-------------------------------+
    | JSON_SEARCH(@j, 'all', '%b%') |
    +-------------------------------+
    | ["$[0]", "$[2].x", "$[3].y"]  |
    +-------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[0]');
    +---------------------------------------------+
    | JSON_SEARCH(@j, 'all', '%b%', NULL, '$[0]') |
    +---------------------------------------------+
    | "$[0]"                                      |
    +---------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]');
    +---------------------------------------------+
    | JSON_SEARCH(@j, 'all', '%b%', NULL, '$[2]') |
    +---------------------------------------------+
    | "$[2].x"                                    |
    +---------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', NULL, '$[1]');
    +---------------------------------------------+
    | JSON_SEARCH(@j, 'all', '%b%', NULL, '$[1]') |
    +---------------------------------------------+
    | NULL                                        |
    +---------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[1]');
    +-------------------------------------------+
    | JSON_SEARCH(@j, 'all', '%b%', '', '$[1]') |
    +-------------------------------------------+
    | NULL                                      |
    +-------------------------------------------+
    
    mysql> SELECT JSON_SEARCH(@j, 'all', '%b%', '', '$[3]');
    +-------------------------------------------+
    | JSON_SEARCH(@j, 'all', '%b%', '', '$[3]') |
    +-------------------------------------------+
    | "$[3].y"                                  |
    +-------------------------------------------+

    有關(guān)MySQL支持JSON的路徑語法,,包括有關(guān)通配符運營規(guī)則的詳細信息 `,,并請參閱 JSON路徑語法

    • 'one':搜索在第一個匹配項后終止,,并返回一個路徑字符串,。未定義首先考慮哪個匹配。

    • 'all':搜索將返回所有匹配的路徑字符串,,以便不包括重復(fù)的路徑,。如果有多個字符串,它們將自動包裝為一個數(shù)組,。數(shù)組元素的順序是不確定的,。

12.17.4修改JSON值的函數(shù)

本節(jié)中的函數(shù)將修改JSON值并返回結(jié)果,。

  • JSON_APPEND(json_doc, path, val[, path, val\] ...)

    將值附加到JSON文檔中指定數(shù)組的末尾并返回結(jié)果,。該函數(shù)JSON_ARRAY_APPEND() 在MySQL 5.7.9中已重命名;別名JSON_APPEND()現(xiàn)在在MySQL 5.7中已棄用,,在MySQL 8.0中已刪除,。

  • JSON_ARRAY_APPEND(json_doc, path, val[, path, val\] ...)

    將值附加到JSON文檔中指定數(shù)組的末尾并返回結(jié)果。返回 NULL是否有任何參數(shù) NULL,。如果json_doc參數(shù)不是有效的JSON文檔或任何path參數(shù)不是有效的路徑表達式或包含 `或通配符,,則會發(fā)生錯誤 。

    路徑值對從左到右評估,。通過評估一對對生成的文檔將成為新的價值,,以此評估下一對。

    如果路徑選擇標量或?qū)ο笾?,則該值將自動包裝在數(shù)組中,,并將新值添加到該數(shù)組中。路徑無法標識JSON文檔中任何值的對將被忽略,。

    mysql> SET @j = '["a", ["b", "c"], "d"]';
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$[1]', 1);
    +----------------------------------+
    | JSON_ARRAY_APPEND(@j, '$[1]', 1) |
    +----------------------------------+
    | ["a", ["b", "c", 1], "d"]        |
    +----------------------------------+
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$[0]', 2);
    +----------------------------------+
    | JSON_ARRAY_APPEND(@j, '$[0]', 2) |
    +----------------------------------+
    | [["a", 2], ["b", "c"], "d"]      |
    +----------------------------------+
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$[1][0]', 3);
    +-------------------------------------+
    | JSON_ARRAY_APPEND(@j, '$[1][0]', 3) |
    +-------------------------------------+
    | ["a", [["b", 3], "c"], "d"]         |
    +-------------------------------------+
    
    mysql> SET @j = '{"a": 1, "b": [2, 3], "c": 4}';
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$.b', 'x');
    +------------------------------------+
    | JSON_ARRAY_APPEND(@j, '$.b', 'x')  |
    +------------------------------------+
    | {"a": 1, "b": [2, 3, "x"], "c": 4} |
    +------------------------------------+
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$.c', 'y');
    +--------------------------------------+
    | JSON_ARRAY_APPEND(@j, '$.c', 'y')    |
    +--------------------------------------+
    | {"a": 1, "b": [2, 3], "c": [4, "y"]} |
    +--------------------------------------+
    
    mysql> SET @j = '{"a": 1}';
    mysql> SELECT JSON_ARRAY_APPEND(@j, '$', 'z');
    +---------------------------------+
    | JSON_ARRAY_APPEND(@j, '$', 'z') |
    +---------------------------------+
    | [{"a": 1}, "z"]                 |
    +---------------------------------+
  • JSON_ARRAY_INSERT(json_doc, path, val[, path, val\] ...)

    更新JSON文檔,,將其插入文檔中的數(shù)組中并返回修改后的文檔。返回 NULL是否有任何參數(shù) NULL,。如果json_doc參數(shù)不是有效的JSON文檔,,或者任何path參數(shù)不是有效的路徑表達式,,或者包含 `或通配符,,或者不以數(shù)組元素標識符結(jié)尾,則會發(fā)生錯誤 ,。

    路徑值對從左到右評估。通過評估一對對生成的文檔將成為新的價值,以此評估下一對,。

    路徑無法標識JSON文檔中任何數(shù)組的對將被忽略,。如果路徑標識數(shù)組元素,則將相應(yīng)的值插入該元素位置,然后將所有后續(xù)值向右移動。如果路徑標識了超出數(shù)組末尾的數(shù)組位置,則將值插入到數(shù)組末尾,。

    mysql> SET @j = '["a", {"b": [1, 2]}, [3, 4]]';
    mysql> SELECT JSON_ARRAY_INSERT(@j, '$[1]', 'x');
    +------------------------------------+
    | JSON_ARRAY_INSERT(@j, '$[1]', 'x') |
    +------------------------------------+
    | ["a", "x", {"b": [1, 2]}, [3, 4]]  |
    +------------------------------------+
    mysql> SELECT JSON_ARRAY_INSERT(@j, '$[100]', 'x');
    +--------------------------------------+
    | JSON_ARRAY_INSERT(@j, '$[100]', 'x') |
    +--------------------------------------+
    | ["a", {"b": [1, 2]}, [3, 4], "x"]    |
    +--------------------------------------+
    mysql> SELECT JSON_ARRAY_INSERT(@j, '$[1].b[0]', 'x');
    +-----------------------------------------+
    | JSON_ARRAY_INSERT(@j, '$[1].b[0]', 'x') |
    +-----------------------------------------+
    | ["a", {"b": ["x", 1, 2]}, [3, 4]]       |
    +-----------------------------------------+
    mysql> SELECT JSON_ARRAY_INSERT(@j, '$[2][1]', 'y');
    +---------------------------------------+
    | JSON_ARRAY_INSERT(@j, '$[2][1]', 'y') |
    +---------------------------------------+
    | ["a", {"b": [1, 2]}, [3, "y", 4]]     |
    +---------------------------------------+
    mysql> SELECT JSON_ARRAY_INSERT(@j, '$[0]', 'x', '$[2][1]', 'y');
    +----------------------------------------------------+
    | JSON_ARRAY_INSERT(@j, '$[0]', 'x', '$[2][1]', 'y') |
    +----------------------------------------------------+
    | ["x", "a", {"b": [1, 2]}, [3, 4]]                  |
    +----------------------------------------------------+

    較早的修改會影響數(shù)組中后續(xù)元素的位置,因此在同一JSON_ARRAY_INSERT()調(diào)用中的后續(xù)路徑 應(yīng)考慮到這一點。在最后一個示例中,第二條路徑不插入任何內(nèi)容,因為該路徑在第一次插入后不再匹配任何內(nèi)容。

  • JSON_INSERT(json_doc, path, val[, path, val\] ...)

    將數(shù)據(jù)插入JSON文檔并返回結(jié)果,。返回NULL是否有任何參數(shù) NULL。如果json_doc參數(shù)不是有效的JSON文檔或任何path參數(shù)不是有效的路徑表達式或包含 `或通配符,則會發(fā)生錯誤 。

    The path-value pairs are evaluated left to right. The document produced by evaluating one pair becomes the new value against which the next pair is evaluated.

    A path-value pair for an existing path in the document is ignored and does not overwrite the existing document value. A path-value pair for a nonexisting path in the document adds the value to the document if the path identifies one of these types of values:

    Otherwise, a path-value pair for a nonexisting path in the document is ignored and has no effect.

    For a comparison of JSON_INSERT(), JSON_REPLACE(), and JSON_SET(), see the discussion of JSON_SET().

    mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
    mysql> SELECT JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]');
    +----------------------------------------------------+
    | JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]') |
    +----------------------------------------------------+
    | {"a": 1, "b": [2, 3], "c": "[true, false]"}        |
    +----------------------------------------------------+

    結(jié)果中列出的第三個也是最后一個值是帶引號的字符串,,而不是像第二個那樣的數(shù)組(在輸出中不帶引號);不會將值強制轉(zhuǎn)換為JSON類型,。要將數(shù)組插入為數(shù)組,,必須顯式執(zhí)行此類轉(zhuǎn)換,,如下所示:

    mysql> SELECT JSON_INSERT(@j, '$.a', 10, '$.c', CAST('[true, false]' AS JSON));
    +------------------------------------------------------------------+
    | JSON_INSERT(@j, '$.a', 10, '$.c', CAST('[true, false]' AS JSON)) |
    +------------------------------------------------------------------+
    | {"a": 1, "b": [2, 3], "c": [true, false]}                        |
    +------------------------------------------------------------------+
    1 row in set (0.00 sec)
    • A member not present in an existing object. The member is added to the object and associated with the new value.

    • A position past the end of an existing array. The array is extended with the new value. If the existing value is not an array, it is autowrapped as an array, then extended with the new value.

  • JSON_MERGE(json_doc, json_doc[, json_doc\] ...)

    合并兩個或多個JSON文檔,。同義詞 JSON_MERGE_PRESERVE(); 在MySQL 5.7.22中已棄用,,并可能在將來的版本中刪除,。

    mysql> SELECT JSON_MERGE('[1, 2]', '[true, false]');
    +---------------------------------------+
    | JSON_MERGE('[1, 2]', '[true, false]') |
    +---------------------------------------+
    | [1, 2, true, false]                   |
    +---------------------------------------+
    1 row in set, 1 warning (0.00 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 1287
    Message: 'JSON_MERGE' is deprecated and will be removed in a future release.  Please use JSON_MERGE_PRESERVE/JSON_MERGE_PATCH instead
    1 row in set (0.00 sec)

    有關(guān)其他示例,請參見的條目 JSON_MERGE_PRESERVE(),。

  • JSON_MERGE_PATCH(json_doc, json_doc[, json_doc\] ...)

    對兩個或多個JSON文檔 執(zhí)行 符合RFC 7396的合并,,并返回合并的結(jié)果,而不會保留具有重復(fù)密鑰的成員,。如果至少有一個作為參數(shù)傳遞給該函數(shù)的文檔無效,,則會引發(fā)錯誤。

    注意

    有關(guān)此函數(shù)和之間的區(qū)別的說明和示例JSON_MERGE_PRESERVE(),,請參閱 JSON_MERGE_PATCH()與JSON_MERGE_PRESERVE()的比較,。

    JSON_MERGE_PATCH() 執(zhí)行如下合并:

    有關(guān)更多信息,請參見 JSON值的規(guī)范化,,合并和自動包裝,。

    mysql> SELECT JSON_MERGE_PATCH('[1, 2]', '[true, false]');
    +---------------------------------------------+
    | JSON_MERGE_PATCH('[1, 2]', '[true, false]') |
    +---------------------------------------------+
    | [true, false]                               |
    +---------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}');
    +-------------------------------------------------+
    | JSON_MERGE_PATCH('{"name": "x"}', '{"id": 47}') |
    +-------------------------------------------------+
    | {"id": 47, "name": "x"}                         |
    +-------------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PATCH('1', 'true');
    +-------------------------------+
    | JSON_MERGE_PATCH('1', 'true') |
    +-------------------------------+
    | true                          |
    +-------------------------------+
    
    mysql> SELECT JSON_MERGE_PATCH('[1, 2]', '{"id": 47}');
    +------------------------------------------+
    | JSON_MERGE_PATCH('[1, 2]', '{"id": 47}') |
    +------------------------------------------+
    | {"id": 47}                               |
    +------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }',
         >     '{ "a": 3, "c":4 }');
    +-----------------------------------------------------------+
    | JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }') |
    +-----------------------------------------------------------+
    | {"a": 3, "b": 2, "c": 4}                                  |
    +-----------------------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }',
         >     '{ "a": 5, "d":6 }');
    +-------------------------------------------------------------------------------+
    | JSON_MERGE_PATCH('{ "a": 1, "b":2 }','{ "a": 3, "c":4 }','{ "a": 5, "d":6 }') |
    +-------------------------------------------------------------------------------+
    | {"a": 5, "b": 2, "c": 4, "d": 6}                                              |
    +-------------------------------------------------------------------------------+

    您可以使用此函數(shù)通過null在seond參數(shù)中指定相同成員的值來刪除成員 ,如下所示:

    mysql> SELECT JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":null}');
    +--------------------------------------------------+
    | JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":null}') |
    +--------------------------------------------------+
    | {"a": 1}                                         |
    +--------------------------------------------------+

    本示例說明該函數(shù)以遞歸方式運行,;也就是說,,成員的值不限于標量,,而是本身可以是JSON文檔:

    mysql> SELECT JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}');
    +----------------------------------------------------+
    | JSON_MERGE_PATCH('{"a":{"x":1}}', '{"a":{"y":2}}') |
    +----------------------------------------------------+
    | {"a": {"x": 1, "y": 2}}                            |
    +----------------------------------------------------+

    JSON_MERGE_PATCH() 在MySQL 5.7.22和更高版本中受支持,。

    JSON_MERGE_PATCH()與JSON_MERGE_PRESERVE()的比較,。 的行為與的行為JSON_MERGE_PATCH()相同 JSON_MERGE_PRESERVE(),,但以下兩個例外:

    本示例比較了將兩個相同的JSON對象(每個具有一個匹配的key "a")與以下兩個函數(shù)的合并結(jié)果:

    mysql> SET @x = '{ "a": 1, "b": 2 }',
         >     @y = '{ "a": 3, "c": 4 }',
         >     @z = '{ "a": 5, "d": 6 }';
    
    mysql> SELECT  JSON_MERGE_PATCH(@x, @y, @z)    AS Patch,
        ->         JSON_MERGE_PRESERVE(@x, @y, @z) AS Preserve\G
    *************************** 1. row ***************************
       Patch: {"a": 5, "b": 2, "c": 4, "d": 6}
    Preserve: {"a": [1, 3, 5], "b": 2, "c": 4, "d": 6}
    • JSON_MERGE_PATCH()刪除與第二個對象中的鍵匹配的第一個對象中的任何成員,前提是與第二個對象中的鍵關(guān)聯(lián)的值不是JSON null,。

    • 如果第二個對象的成員具有與第一個對象中的成員匹配的鍵,,則 JSON_MERGE_PATCH() 第二個對象中的值替換第一個對象中的值,而 JSON_MERGE_PRESERVE() 第二個值附加到第一個值中,。

    • 第一個對象的所有成員在第二個對象中不具有具有相同鍵的對應(yīng)成員,。

    • 第二個對象的所有成員,在第一個對象中沒有對應(yīng)的鍵,,并且其值不是JSON null文字,。

    • 具有第一個和第二個對象中都存在且其第二個對象中的值不是JSON null 文字的鍵的所有成員。這些成員的值是將第一個對象中的值與第二個對象中的值遞歸合并的結(jié)果,。

    1. 如果第一個參數(shù)不是對象,,則合并的結(jié)果與將空對象與第二個參數(shù)合并的結(jié)果相同。

    2. 如果第二個參數(shù)不是對象,,則合并的結(jié)果為第二個參數(shù),。

    3. 如果兩個參數(shù)都是對象,則合并結(jié)果是具有以下成員的對象:

  • JSON_MERGE_PRESERVE(json_doc, json_doc[, json_doc\] ...)

    合并兩個或多個JSON文檔并返回合并的結(jié)果,。返回NULL是否有任何參數(shù) NULL,。如果任何參數(shù)不是有效的JSON文檔,則會發(fā)生錯誤,。

    合并根據(jù)以下規(guī)則進行,。有關(guān)更多信息,請參見 JSON值的規(guī)范化,,合并和自動包裝,。

    mysql> SELECT JSON_MERGE_PRESERVE('[1, 2]', '[true, false]');
    +------------------------------------------------+
    | JSON_MERGE_PRESERVE('[1, 2]', '[true, false]') |
    +------------------------------------------------+
    | [1, 2, true, false]                            |
    +------------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PRESERVE('{"name": "x"}', '{"id": 47}');
    +----------------------------------------------------+
    | JSON_MERGE_PRESERVE('{"name": "x"}', '{"id": 47}') |
    +----------------------------------------------------+
    | {"id": 47, "name": "x"}                            |
    +----------------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PRESERVE('1', 'true');
    +----------------------------------+
    | JSON_MERGE_PRESERVE('1', 'true') |
    +----------------------------------+
    | [1, true]                        |
    +----------------------------------+
    
    mysql> SELECT JSON_MERGE_PRESERVE('[1, 2]', '{"id": 47}');
    +---------------------------------------------+
    | JSON_MERGE_PRESERVE('[1, 2]', '{"id": 47}') |
    +---------------------------------------------+
    | [1, 2, {"id": 47}]                          |
    +---------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }',
         >    '{ "a": 3, "c": 4 }');
    +--------------------------------------------------------------+
    | JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }','{ "a": 3, "c":4 }') |
    +--------------------------------------------------------------+
    | {"a": [1, 3], "b": 2, "c": 4}                                |
    +--------------------------------------------------------------+
    
    mysql> SELECT JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }','{ "a": 3, "c": 4 }',
         >    '{ "a": 5, "d": 6 }');
    +----------------------------------------------------------------------------------+
    | JSON_MERGE_PRESERVE('{ "a": 1, "b": 2 }','{ "a": 3, "c": 4 }','{ "a": 5, "d": 6 }') |
    +----------------------------------------------------------------------------------+
    | {"a": [1, 3, 5], "b": 2, "c": 4, "d": 6}                                         |
    +----------------------------------------------------------------------------------+

    此功能已在MySQL 5.7.22中添加為的同義詞 JSON_MERGE(),。JSON_MERGE()現(xiàn)在不推薦使用該功能,并且在將來的MySQL版本中可能會刪除該 功能,。

    This function is similar to but differs from JSON_MERGE_PATCH() in significant respects; see JSON_MERGE_PATCH() compared with JSON_MERGE_PRESERVE(), for more information.

    • 相鄰數(shù)組合并為一個數(shù)組,。

    • 相鄰對象合并為單個對象。

    • 標量值將自動包裝為數(shù)組,,然后合并為數(shù)組,。

    • 通過將對象自動包裝為一個數(shù)組并將兩個數(shù)組合并,可以合并相鄰的數(shù)組和對象,。

  • JSON_REMOVE(json_doc, path[, path\] ...)

    Removes data from a JSON document and returns the result. Returns NULL if any argument is NULL. An error occurs if the json_doc argument is not a valid JSON document or any path argument is not a valid path expression or is $ or contains a ` or wildcard.

    該path參數(shù)進行評估從左到右,。通過評估一個路徑生成的文檔將成為評估下一個路徑所依據(jù)的新值。

    如果要刪除的元素在文檔中不存在,,這不是錯誤,;在這種情況下,路徑不會影響文檔,。

    mysql> SET @j = '["a", ["b", "c"], "d"]';
    mysql> SELECT JSON_REMOVE(@j, '$[1]');
    +-------------------------+
    | JSON_REMOVE(@j, '$[1]') |
    +-------------------------+
    | ["a", "d"]              |
    +-------------------------+
  • JSON_REPLACE(json_doc, path, val[, path, val\] ...)

    替換JSON文檔中的現(xiàn)有值并返回結(jié)果,。返回NULL是否有任何參數(shù) NULL。如果json_doc參數(shù)不是有效的JSON文檔或任何path參數(shù)不是有效的路徑表達式或包含 `或通配符,,則會發(fā)生錯誤 ,。

    路徑值對從左到右評估。通過評估一對對生成的文檔將成為新的價值,,以此評估下一對,。

    文檔中現(xiàn)有路徑的路徑-值對使用新值覆蓋現(xiàn)有文檔值。文檔中不存在的路徑的路徑-值對將被忽略,,并且無效,。

    為了進行比較 JSON_INSERT()JSON_REPLACE()以及 JSON_SET(),,看到的討論JSON_SET(),。

    mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
    mysql> SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]');
    +-----------------------------------------------------+
    | JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]') |
    +-----------------------------------------------------+
    | {"a": 10, "b": [2, 3]}                              |
    +-----------------------------------------------------+
  • JSON_SET(json_doc, path, val[, path, val\] ...)

    在JSON文檔中插入或更新數(shù)據(jù)并返回結(jié)果。NULL如果任何參數(shù)是 NULL或path,,則返回,,如果給定,則不定位對象,。如果json_doc參數(shù)不是有效的JSON文檔或任何path參數(shù)不是有效的路徑表達式或包含 `或通配符,,則會發(fā)生錯誤 。

    路徑值對從左到右評估,。通過評估一對對生成的文檔將成為新的價值,,以此評估下一對。

    文檔中現(xiàn)有路徑的路徑-值對使用新值覆蓋現(xiàn)有文檔值,。如果路徑中標識以下類型的值之一,,則文檔中不存在的路徑的路徑-值對會將值添加到文檔中:

    否則,,文檔中不存在的路徑的路徑-值對將被忽略,并且無效,。

    JSON_SET(),, JSON_INSERT()JSON_REPLACE()功能的關(guān)系:

    以下示例使用文檔中存在的一個路徑($.a)和不存在的另一路徑()說明了這些差異$.c

    mysql> SET @j = '{ "a": 1, "b": [2, 3]}';
    mysql> SELECT JSON_SET(@j, '$.a', 10, '$.c', '[true, false]');
    +-------------------------------------------------+
    | JSON_SET(@j, '$.a', 10, '$.c', '[true, false]') |
    +-------------------------------------------------+
    | {"a": 10, "b": [2, 3], "c": "[true, false]"}    |
    +-------------------------------------------------+
    mysql> SELECT JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]');
    +----------------------------------------------------+
    | JSON_INSERT(@j, '$.a', 10, '$.c', '[true, false]') |
    +----------------------------------------------------+
    | {"a": 1, "b": [2, 3], "c": "[true, false]"}        |
    +----------------------------------------------------+
    mysql> SELECT JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]');
    +-----------------------------------------------------+
    | JSON_REPLACE(@j, '$.a', 10, '$.c', '[true, false]') |
    +-----------------------------------------------------+
    | {"a": 10, "b": [2, 3]}                              |
    +-----------------------------------------------------+
    • 現(xiàn)有對象中不存在的成員,。成員被添加到對象并與新值關(guān)聯(lián),。

    • 超出現(xiàn)有數(shù)組末尾的位置。用新值擴展數(shù)組,。如果現(xiàn)有值不是數(shù)組,,則將其自動包裝為數(shù)組,然后使用新值進行擴展,。

  • JSON_UNQUOTE(json_val)

    Unquotes JSON value and returns the result as a utf8mb4 string. Returns NULL if the argument is NULL. An error occurs if the value starts and ends with double quotes but is not a valid JSON string literal.

    在字符串中,,某些序列具有特殊含義,除非NO_BACKSLASH_ESCAPES啟用了SQL模式,。每個序列都以反斜杠(\)開頭,,即 轉(zhuǎn)義字符。MySQL可以識別 表12.22“ JSON_UNQUOTE()特殊字符轉(zhuǎn)義序列”中所示的轉(zhuǎn)義序列,。對于所有其他轉(zhuǎn)義序列,,將忽略反斜杠。即,,將轉(zhuǎn)義字符解釋為好像沒有轉(zhuǎn)義,。例如,\xis x,。這些序列區(qū)分大小寫,。例如, \b被解釋為退格,,但 \B被解釋為B,。

    表12.22 JSON_UNQUOTE()特殊字符轉(zhuǎn)義序列

    轉(zhuǎn)義序列序列表示的字符
    \"雙引號(")字符
    \b退格字符
    \f換頁符
    \n換行符(換行符)
    \r回車符
    \t制表符
    \\反斜杠(\)字符
    \uXXXXUnicode值的UTF-8字節(jié) XXXX

    這里顯示了使用此功能的兩個簡單示例:

    mysql> SET @j = '"abc"';
    mysql> SELECT @j, JSON_UNQUOTE(@j);
    +-------+------------------+
    | @j    | JSON_UNQUOTE(@j) |
    +-------+------------------+
    | "abc" | abc              |
    +-------+------------------+
    mysql> SET @j = '[1, 2, 3]';
    mysql> SELECT @j, JSON_UNQUOTE(@j);
    +-----------+------------------+
    | @j        | JSON_UNQUOTE(@j) |
    +-----------+------------------+
    | [1, 2, 3] | [1, 2, 3]        |
    +-----------+------------------+

    以下示例集顯示了如何 JSON_UNQUOTENO_BACKSLASH_ESCAPES 禁用和啟用的情況下進行轉(zhuǎn)義 :

    mysql> SELECT @@sql_mode;
    +------------+
    | @@sql_mode |
    +------------+
    |            |
    +------------+
    
    mysql> SELECT JSON_UNQUOTE('"\\t\\u0032"');
    +------------------------------+
    | JSON_UNQUOTE('"\\t\\u0032"') |
    +------------------------------+
    |       2                           |
    +------------------------------+
    
    mysql> SET @@sql_mode = 'NO_BACKSLASH_ESCAPES';
    mysql> SELECT JSON_UNQUOTE('"\\t\\u0032"');
    +------------------------------+
    | JSON_UNQUOTE('"\\t\\u0032"') |
    +------------------------------+
    | \t\u0032                     |
    +------------------------------+
    
    mysql> SELECT JSON_UNQUOTE('"\t\u0032"');
    +----------------------------+
    | JSON_UNQUOTE('"\t\u0032"') |
    +----------------------------+
    |       2                         |
    +----------------------------+

12.17.5返回JSON值屬性的函數(shù)

本節(jié)中的函數(shù)返回JSON值的屬性。

  • JSON_DEPTH(json_doc)

    返回JSON文檔的最大深度,。NULL如果參數(shù)為,,則 返回 NULL。如果參數(shù)不是有效的JSON文檔,,則會發(fā)生錯誤,。

    空數(shù)組,空對象或標量值的深度為1,。僅包含深度1的元素的非空數(shù)組或僅包含深度1的成員值的非空對象的深度為2,。否則,,JSON文檔的深度大于2。

    mysql> SELECT JSON_DEPTH('{}'), JSON_DEPTH('[]'), JSON_DEPTH('true');
    +------------------+------------------+--------------------+
    | JSON_DEPTH('{}') | JSON_DEPTH('[]') | JSON_DEPTH('true') |
    +------------------+------------------+--------------------+
    |                1 |                1 |                  1 |
    +------------------+------------------+--------------------+
    mysql> SELECT JSON_DEPTH('[10, 20]'), JSON_DEPTH('[[], {}]');
    +------------------------+------------------------+
    | JSON_DEPTH('[10, 20]') | JSON_DEPTH('[[], {}]') |
    +------------------------+------------------------+
    |                      2 |                      2 |
    +------------------------+------------------------+
    mysql> SELECT JSON_DEPTH('[10, {"a": 20}]');
    +-------------------------------+
    | JSON_DEPTH('[10, {"a": 20}]') |
    +-------------------------------+
    |                             3 |
    +-------------------------------+
  • JSON_LENGTH(json_doc[, path\])

    返回JSON文檔的長度,,或者,,如果提供了path參數(shù),則返回 由路徑標識的文檔中值的長度,。返回NULL是否有任何自變量 NULL或自path 變量不能標識文檔中的值,。如果json_doc參數(shù)不是有效的JSON文檔,或者 path參數(shù)不是有效的路徑表達式或包含`或 通配符,,則會發(fā)生錯誤,。

    文件長度確定如下:

    mysql> SELECT JSON_LENGTH('[1, 2, {"a": 3}]');
    +---------------------------------+
    | JSON_LENGTH('[1, 2, {"a": 3}]') |
    +---------------------------------+
    |                               3 |
    +---------------------------------+
    mysql> SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}');
    +-----------------------------------------+
    | JSON_LENGTH('{"a": 1, "b": {"c": 30}}') |
    +-----------------------------------------+
    |                                       2 |
    +-----------------------------------------+
    mysql> SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b');
    +------------------------------------------------+
    | JSON_LENGTH('{"a": 1, "b": {"c": 30}}', '$.b') |
    +------------------------------------------------+
    |                                              1 |
    +------------------------------------------------+
    • 標量的長度為1。

    • 數(shù)組的長度是數(shù)組元素的數(shù)量,。

    • 對象的長度是對象成員的數(shù)量,。

    • 該長度不計算嵌套數(shù)組或?qū)ο蟮拈L度。

  • JSON_TYPE(json_val)

    返回utf8mb4指示JSON值類型的字符串,??梢允菍ο螅瑪?shù)組或標量類型,,如下所示:

    mysql> SET @j = '{"a": [10, true]}';
    mysql> SELECT JSON_TYPE(@j);
    +---------------+
    | JSON_TYPE(@j) |
    +---------------+
    | OBJECT        |
    +---------------+
    mysql> SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a'));
    +------------------------------------+
    | JSON_TYPE(JSON_EXTRACT(@j, '$.a')) |
    +------------------------------------+
    | ARRAY                              |
    +------------------------------------+
    mysql> SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]'));
    +---------------------------------------+
    | JSON_TYPE(JSON_EXTRACT(@j, '$.a[0]')) |
    +---------------------------------------+
    | INTEGER                               |
    +---------------------------------------+
    mysql> SELECT JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]'));
    +---------------------------------------+
    | JSON_TYPE(JSON_EXTRACT(@j, '$.a[1]')) |
    +---------------------------------------+
    | BOOLEAN                               |
    +---------------------------------------+

    JSON_TYPE()返回 NULL參數(shù)是否為 NULL

    mysql> SELECT JSON_TYPE(NULL);
    +-----------------+
    | JSON_TYPE(NULL) |
    +-----------------+
    | NULL            |
    +-----------------+

    如果參數(shù)不是有效的JSON值,,則會發(fā)生錯誤:

    mysql> SELECT JSON_TYPE(1);
    ERROR 3146 (22032): Invalid data type for JSON data in argument 1
    to function json_type; a JSON string or JSON type is required.

    對于NULL非錯誤結(jié)果,以下列表描述了可能的 JSON_TYPE()返回值:

    • OPAQUE (原始位)

    • OBJECT:JSON對象

    • ARRAY:JSON數(shù)組

    • BOOLEAN:JSON正確和錯誤文字

    • NULL:JSON空文字

    • 純JSON類型:

    • 數(shù)值類型:

    • 時間類型:

    • 字符串類型:

    • 二進制類型:

    • 所有其他類型:

  • JSON_VALID(val)

    返回0或1以指示值是否有效JSON。NULL如果參數(shù)為,,則 返回NULL,。

    mysql> SELECT JSON_VALID('{"a": 1}');
    +------------------------+
    | JSON_VALID('{"a": 1}') |
    +------------------------+
    |                      1 |
    +------------------------+
    mysql> SELECT JSON_VALID('hello'), JSON_VALID('"hello"');
    +---------------------+-----------------------+
    | JSON_VALID('hello') | JSON_VALID('"hello"') |
    +---------------------+-----------------------+
    |                   0 |                     1 |
    +---------------------+-----------------------+

12.17.6 JSON實用程序功能

本節(jié)介紹了作用于JSON值的實用程序函數(shù),或可以解析為JSON值的字符串,。 JSON_PRETTY()以易于閱讀的格式輸出JSON值,。 JSON_STORAGE_SIZE()顯示給定JSON值使用的存儲空間量。

  • JSON_PRETTY(json_val)

    提供漂亮的JSON值打印,,類似于用PHP以及其他語言和數(shù)據(jù)庫系統(tǒng)實現(xiàn)的JSON值,。提供的值必須是JSON值或JSON值的有效字符串表示形式。此值中存在多余的空格和換行符對輸出沒有影響。對于NULL值,,函數(shù)返回NULL,。如果該值不是JSON文檔,或者無法將其解析為一個文檔,,則該函數(shù)將失敗并顯示錯誤,。

    此函數(shù)的輸出格式遵循以下規(guī)則:

    mysql> SELECT JSON_PRETTY('123'); # scalar
    +--------------------+
    | JSON_PRETTY('123') |
    +--------------------+
    | 123                |
    +--------------------+
    
    mysql> SELECT JSON_PRETTY("[1,3,5]"); # array
    +------------------------+
    | JSON_PRETTY("[1,3,5]") |
    +------------------------+
    | [
      1,
      3,
      5
    ]      |
    +------------------------+
    
    mysql> SELECT JSON_PRETTY('{"a":"10","b":"15","x":"25"}'); # object
    +---------------------------------------------+
    | JSON_PRETTY('{"a":"10","b":"15","x":"25"}') |
    +---------------------------------------------+
    | {
      "a": "10",
      "b": "15",
      "x": "25"
    }   |
    +---------------------------------------------+
    
    mysql> SELECT JSON_PRETTY('["a",1,{"key1":
         >    "value1"},"5",     "77" ,
         >       {"key2":["value3","valueX",
         > "valueY"]},"j", "2"   ]')\G  # nested arrays and objects
    *************************** 1. row ***************************
    JSON_PRETTY('["a",1,{"key1":
                 "value1"},"5",     "77" ,
                    {"key2":["value3","valuex",
              "valuey"]},"j", "2"   ]'): [
      "a",
      1,
      {
        "key1": "value1"
      },
      "5",
      "77",
      {
        "key2": [
          "value3",
          "valuex",
          "valuey"
        ]
      },
      "j",
      "2"
    ]

    在MySQL 5.7.22中添加。

    • 每個數(shù)組元素或?qū)ο蟪蓡T都顯示在單獨的行上,,與其父級相比縮進了一個附加級別,。

    • 每個縮進級別都會添加兩個前導(dǎo)空格。

    • 在分隔兩個元素或成員的換行符之前,,將逗號分隔單個數(shù)組元素或?qū)ο蟪蓡T打印出來,。

    • 對象成員的鍵和值用冒號分隔,后跟一個空格(' : '),。

    • 空對象或數(shù)組將打印在一行上,。左括號和右括號之間沒有印刷空間。

    • 字符串標量和鍵名中的特殊字符使用該JSON_QUOTE()函數(shù)使用的相同規(guī)則進行轉(zhuǎn)義 ,。

  • JSON_STORAGE_SIZE(json_val)

    此函數(shù)返回用于存儲JSON文檔的二進制表示形式的字節(jié)數(shù)。當參數(shù)為JSON列時,,這是用于存儲JSON文檔的空間,。json_val 必須是有效的JSON文檔或可以解析為一個字符串。如果是字符串,,該函數(shù)將通過將字符串解析為JSON并將其轉(zhuǎn)換為二進制來創(chuàng)建的JSON二進制表示形式返回存儲空間量,。NULL如果參數(shù)為,則返回NULL,。

    當json_val不是NULL,,并且不是或無法成功解析為JSON文檔時,將導(dǎo)致錯誤,。

    為了說明此函數(shù)在以JSON列作為參數(shù)時的行為 ,,我們創(chuàng)建了一個jtable包含 JSONjcol的表,在表中插入JSON值,,然后使用來獲得該列使用的存儲空間 JSON_STORAGE_SIZE(),,如下所示:

    mysql> CREATE TABLE jtable (jcol JSON);
    Query OK, 0 rows affected (0.42 sec)
    
    mysql> INSERT INTO jtable VALUES
        ->     ('{"a": 1000, "b": "wxyz", "c": "[1, 3, 5, 7]"}');
    Query OK, 1 row affected (0.04 sec)
    
    mysql> SELECT
        ->     jcol,
        ->     JSON_STORAGE_SIZE(jcol) AS Size
        -> FROM jtable;
    +-----------------------------------------------+------+
    | jcol                                          | Size |
    +-----------------------------------------------+------+
    | {"a": 1000, "b": "wxyz", "c": "[1, 3, 5, 7]"} |   47 |
    +-----------------------------------------------+------+
    1 row in set (0.00 sec)

    根據(jù)的輸出 JSON_STORAGE_SIZE(),插入到列中的JSON文檔占用47個字節(jié),。更新后,,該函數(shù)將顯示用于新設(shè)置值的存儲:

    mysql> UPDATE jtable
    mysql>     SET jcol = '{"a": 4.55, "b": "wxyz", "c": "[true, false]"}';
    Query OK, 1 row affected (0.04 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> SELECT
        ->     jcol,
        ->     JSON_STORAGE_SIZE(jcol) AS Size
        -> FROM jtable;
    +------------------------------------------------+------+
    | jcol                                           | Size |
    +------------------------------------------------+------+
    | {"a": 4.55, "b": "wxyz", "c": "[true, false]"} |   56 |
    +------------------------------------------------+------+
    1 row in set (0.00 sec)

    此函數(shù)還顯示當前用于在用戶變量中存儲JSON文檔的空間:

    mysql> SET @j = '[100, "sakila", [1, 3, 5], 425.05]';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @j, JSON_STORAGE_SIZE(@j) AS Size;
    +------------------------------------+------+
    | @j                                 | Size |
    +------------------------------------+------+
    | [100, "sakila", [1, 3, 5], 425.05] |   45 |
    +------------------------------------+------+
    1 row in set (0.00 sec)
    
    mysql> SET @j = JSON_SET(@j, '$[1]', "json");
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @j, JSON_STORAGE_SIZE(@j) AS Size;
    +----------------------------------+------+
    | @j                               | Size |
    +----------------------------------+------+
    | [100, "json", [1, 3, 5], 425.05] |   43 |
    +----------------------------------+------+
    1 row in set (0.00 sec)
    
    mysql> SET @j = JSON_SET(@j, '$[2][0]', JSON_ARRAY(10, 20, 30));
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @j, JSON_STORAGE_SIZE(@j) AS Size;
    +---------------------------------------------+------+
    | @j                                          | Size |
    +---------------------------------------------+------+
    | [100, "json", [[10, 20, 30], 3, 5], 425.05] |   56 |
    +---------------------------------------------+------+
    1 row in set (0.00 sec)

    對于JSON文字,此函數(shù)還返回當前使用的存儲空間,,如下所示:

    mysql> SELECT
        ->     JSON_STORAGE_SIZE('[100, "sakila", [1, 3, 5], 425.05]') AS A,
        ->     JSON_STORAGE_SIZE('{"a": 1000, "b": "a", "c": "[1, 3, 5, 7]"}') AS B,
        ->     JSON_STORAGE_SIZE('{"a": 1000, "b": "wxyz", "c": "[1, 3, 5, 7]"}') AS C,
        ->     JSON_STORAGE_SIZE('[100, "json", [[10, 20, 30], 3, 5], 425.05]') AS D;
    +----+----+----+----+
    | A  | B  | C  | D  |
    +----+----+----+----+
    | 45 | 44 | 47 | 56 |
    +----+----+----+----+
    1 row in set (0.00 sec)

    此功能已在MySQL 5.7.22中添加,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多