时间:2021-05-24
官方文档:JSON Functions
Name Description JSON_APPEND() Append data to JSON document JSON_ARRAY() Create JSON array JSON_ARRAY_APPEND() Append data to JSON document JSON_ARRAY_INSERT() Insert into JSON array -> Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT(). JSON_CONTAINS() Whether JSON document contains specific object at path JSON_CONTAINS_PATH() Whether JSON document contains any data at path JSON_DEPTH() Maximum depth of JSON document JSON_EXTRACT() Return data from JSON document ->> Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()). JSON_INSERT() Insert data into JSON document JSON_KEYS() Array of keys from JSON document JSON_LENGTH() Number of elements in JSON document JSON_MERGE() Merge JSON documents JSON_OBJECT() Create JSON object JSON_QUOTE() Quote JSON document JSON_REMOVE() Remove data from JSON document JSON_REPLACE() Replace values in JSON document JSON_SEARCH() Path to value within JSON document JSON_SET() Insert data into JSON document JSON_TYPE() Type of JSON value JSON_UNQUOTE() Unquote JSON value JSON_VALID() Whether JSON value is valid
MySQL里的json分为json array和json object。 $表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json object,含有特殊字符的key要用"括起来,比如$."my name")。
例如:[3, {"a": [5, 6], "b": 10}, [99, 100]],那么:
$[0]:3
$[1]: {"a": [5, 6], "b": 10}
$[2] :[99, 100]
$[3] : NULL
$[1].a:[5, 6]
$[1].a[1]:6
$[1].b:10
$[2][0]:99
json中的数据可以用 =, <, <=, >, >=, <>, !=, and <=> 进行比较。但json里的数据类型可以是多样的,那么在不同类型之间进行比较时,就有优先级了,高优先级的要大于低优先级的(可以用JSON_TYPE()函数查看类型)。优先级从高到低如下:
BLOB
BIT
OPAQUE
DATETIME
TIME
DATE
BOOLEAN
ARRAY
OBJECT
STRING
INTEGER, DOUBLE
NULL
3.1.1 JSON_ARRAY
JSON_ARRAY(val1,val2,val3...)
生成一个包含指定元素的json数组。
mysql> SELECT JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME());+---------------------------------------------+| JSON_ARRAY(1, "abc", NULL, TRUE, CURTIME()) |+---------------------------------------------+| [1, "abc", null, true, "11:30:24.000000"] |+---------------------------------------------+3.1.2 JSON_OBJECT
JSON_OBJECT(key1,val1,key2,val2...)
生成一个包含指定K-V对的json object。如果有key为NULL或参数个数为奇数,则抛错。
mysql> SELECT JSON_OBJECT('id', 87, 'name', 'carrot');+-----------------------------------------+| JSON_OBJECT('id', 87, 'name', 'carrot') |+-----------------------------------------+| {"id": 87, "name": "carrot"} |+-----------------------------------------+3.1.3 JSON_QUOTE
JSON_QUOTE(json_val)
将json_val用"号括起来。
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]" |+-------------------------+3.1.4 CONVERT
CONVERT(json_string,JSON)
mysql> select CONVERT('{"mail": "amy@gmail.com", "name": "Amy"}',JSON);+----------------------------------------------------------+| CONVERT('{"mail": "amy@gmail.com", "name": "Amy"}',JSON) |+----------------------------------------------------------+| {"mail": "amy@gmail.com", "name": "Amy"} |+----------------------------------------------------------+3.2.1 JSON_CONTAINS
JSON_CONTAINS(json_doc, val[, path])
查询json文档是否在指定path包含指定的数据,包含则返回1,否则返回0。如果有参数为NULL或path不存在,则返回NULL。
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 |+-------------------------------+3.2.2 JSON_CONTAINS_PATH
JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
查询是否存在指定路径,存在则返回1,否则返回0。如果有参数为NULL,则返回NULL。
one_or_all只能取值"one"或"all",one表示只要有一个存在即可;all表示所有的都存在才行。
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 |+----------------------------------------+3.2.3 JSON_EXTRACT
JSON_EXTRACT(json_doc, path[, path] ...)
从json文档里抽取数据。如果有参数有NULL或path不存在,则返回NULL。如果抽取出多个path,则返回的数据封闭在一个json array里。
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+里可以用"->"替代。
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)在MySQL 5.7.13+,还可以用"->>"表示去掉抽取结果的"号,下面三种效果是一样的:
3.2.4 JSON_KEYS
JSON_KEYS(json_doc[, path])
获取json文档在指定路径下的所有键值,返回一个json array。如果有参数为NULL或path不存在,则返回NULL。
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"] |+----------------------------------------------+3.2.5 JSON_SEARCH
JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
查询包含指定字符串的paths,并作为一个json array返回。如果有参数为NUL或path不存在,则返回NULL。
3.3.1 JSON_APPEND/JSON_ARRAY_APPEND
JSON_ARRAY_APPEND(json_doc, path, val[, path, val] ...)
在指定path的json array尾部追加val。如果指定path是一个json object,则将其封装成一个json array再追加。如果有参数为NULL,则返回NULL。
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"] |+---------------------------------+3.3.2 JSON_ARRAY_INSERT
JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
在path指定的json array元素插入val,原位置及以右的元素顺次右移。如果path指定的数据非json array元素,则略过此val;如果指定的元素下标超过json array的长度,则插入尾部。
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]] |+----------------------------------------------------+3.3.3 JSON_INSERT/JSON_REPLACE/JSON_SET
JSON_INSERT(json_doc, path, val[, path, val] ...)
在指定path下插入数据,如果path已存在,则忽略此val(不存在才插入)。
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]"} |+----------------------------------------------------+JSON_REPLACE(json_doc, path, val[, path, val] ...)
替换指定路径的数据,如果某个路径不存在则略过(存在才替换)。如果有参数为NULL,则返回NULL。
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] ...)
设置指定路径的数据(不管是否存在)。如果有参数为NULL,则返回NULL。
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]} |+-----------------------------------------------------+3.3.4 JSON_MERGE
JSON_MERGE(json_doc, json_doc[, json_doc] ...)
merge多个json文档。规则如下:
3.3.5 JSON_REMOVE
JSON_REMOVE(json_doc, path[, path] ...)
移除指定路径的数据,如果某个路径不存在则略过此路径。如果有参数为NULL,则返回NULL。
mysql> SET @j = '["a", ["b", "c"], "d"]';mysql> SELECT JSON_REMOVE(@j, '$[1]');+-------------------------+| JSON_REMOVE(@j, '$[1]') |+-------------------------+| ["a", "d"] |+-------------------------+3.3.6 JSON_UNQUOTE
JSON_UNQUOTE(val)
去掉val的引号。如果val为NULL,则返回NULL。
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] |+-----------+------------------+3.4.1 JSON_DEEPTH
JSON_DEPTH(json_doc)
获取json文档的深度。如果参数为NULL,则返回NULL。
空的json array、json object或标量的深度为1。
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 |+-------------------------------+3.4.2 JSON_LENGTH
JSON_LENGTH(json_doc[, path])
获取指定路径下的长度。如果参数为NULL,则返回NULL。
长度的计算规则:
3.4.3 JSON_TYPE
JSON_TYPE(json_val)
获取json文档的具体类型。如果参数为NULL,则返回NULL。
3.4.4 JSON_VALID
JSON_VALID(val)
判断val是否为有效的json格式,是为1,不是为0。如果参数为NUL,则返回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 |+---------------------+-----------------------+到此这篇关于MySQL处理JSON常见函数的使用的文章就介绍到这了,更多相关MySQL JSON常见函数内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
mysql(5.6及以下)解析json#json解析函数DELIMITER$$DROPFUNCTIONIFEXISTS`json_extract_c`$$CRE
本文实例讲述了MySQL流程函数常见用法。分享给大家供大家参考,具体如下:流程函数是MySQL相对常用的一类函数,用户可以使用这类函数在一个SQL语句中实现条件
如下所示:JSON函数使用JSON函数需要导入json库:importjson。函数描述json.dumps将Python对象编码成JSON字符串json.lo
php输出json及显示json中的中文汉字在php中,我们经常需要将数组输出json,只需要使用json_encode函数处理一下数组即可,但有的时候数组里面
JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,易于人阅读和编写。JSON函数使用JSON函数需要导入json库:imp