来源:http://www.cnblogs.com/waterystone/p/5626098.html;

1. 概述

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

2. 比较规则

json中的数据可以用 =, <, <=, >, >=, <>, !=, and <=> 进行比较。但json里的数据类型可以是多样的,那么在不同类型之间进行比较时,就有优先级了,高优先级的要大于低优先级的(可以用JSON_TYPE()函数查看类型)。优先级从高到低如下:

1

2

3

4

5

6

7

8

9

10

11

12

BLOB

BIT

OPAQUE

DATETIME

TIME

DATE

BOOLEAN

ARRAY

OBJECT

STRING

INTEGER, DOUBLE

NULL

  

3. 常用函数

3.1 创建函数

3.1.1 JSON_ARRAY

JSON_ARRAY(val1,val2,val3...)

生成一个包含指定元素的json数组。

1

2

3

4

5

6

mysql> SELECT JSON_ARRAY(1, "abc"NULLTRUE, CURTIME());

+---------------------------------------------+

| JSON_ARRAY(1, "abc"NULLTRUE, CURTIME()) |

+---------------------------------------------+

| [1, "abc"nulltrue"11:30:24.000000"]   |

+---------------------------------------------+

  

3.1.2 JSON_OBJECT

JSON_OBJECT(key1,val1,key2,val2...)

生成一个包含指定K-V对的json object。如果有key为NULL或参数个数为奇数,则抛错。

1

2

3

4

5

6

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用"号括起来。

1

2

3

4

5

6

7

8

9

10

11

12

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)

1

2

3

4

5

6

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 查询函数  

3.2.1 JSON_CONTAINS

JSON_CONTAINS(json_doc, val[, path])

查询json文档是否在指定path包含指定的数据,包含则返回1,否则返回0。如果有参数为NULL或path不存在,则返回NULL。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

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表示所有的都存在才行。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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里。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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+里可以用"->"替代。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

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 |

+-------------------------------+-----------+------+

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 |

+-------------------------------+-----------+------+

rows in set (0.00 sec)

  

在MySQL 5.7.13+,还可以用"->>"表示去掉抽取结果的"号,下面三种效果是一样的:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

mysql> SELECT FROM jemp WHERE g > 2;

+-------------------------------+------+

| c                             | g    |

+-------------------------------+------+

| {"id""3""name""Barney"} |    3 |

| {"id""4""name""Betty"}  |    4 |

+-------------------------------+------+

rows in set (0.01 sec)

mysql> SELECT c->'$.name' AS name

    ->     FROM jemp WHERE g > 2;

+----------+

name     |

+----------+

"Barney" |

"Betty"  |

+----------+

rows in set (0.00 sec)

mysql> SELECT JSON_UNQUOTE(c->'$.name'AS name

    ->     FROM jemp WHERE g > 2;

+--------+

name   |

+--------+

| Barney |

| Betty  |

+--------+

rows in set (0.00 sec)

mysql> SELECT c->>'$.name' AS name

    ->     FROM jemp WHERE g > 2;

+--------+

name   |

+--------+

| Barney |

| Betty  |

+--------+

rows in set (0.00 sec)

 

3.2.4 JSON_KEYS

JSON_KEYS(json_doc[, path])

获取json文档在指定路径下的所有键值,返回一个json array。如果有参数为NULL或path不存在,则返回NULL。

1

2

3

4

5

6

7

8

9

10

11

12

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。

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

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

path:在指定path下查。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

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"                                  |

+-------------------------------------------+

  

3.3 修改函数

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。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

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的长度,则插入尾部。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

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(不存在才插入)。

1

2

3

4

5

6

7

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。

1

2

3

4

5

6

7

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。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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文档。规则如下:

  • 如果都是json array,则结果自动merge为一个json array;
  • 如果都是json object,则结果自动merge为一个json object;
  • 如果有多种类型,则将非json array的元素封装成json array再按照规则一进行mege。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

mysql> SELECT JSON_MERGE('[1, 2]''[true, false]');

+---------------------------------------+

| JSON_MERGE('[1, 2]''[true, false]') |

+---------------------------------------+

| [1, 2, truefalse]                   |

+---------------------------------------+

mysql> SELECT JSON_MERGE('{"name": "x"}''{"id": 47}');

+-------------------------------------------+

| JSON_MERGE('{"name": "x"}''{"id": 47}') |

+-------------------------------------------+

| {"id": 47, "name""x"}                   |

+-------------------------------------------+

mysql> SELECT JSON_MERGE('1''true');

+-------------------------+

| JSON_MERGE('1''true') |

+-------------------------+

| [1, true]               |

+-------------------------+

mysql> SELECT JSON_MERGE('[1, 2]''{"id": 47}');

+------------------------------------+

| JSON_MERGE('[1, 2]''{"id": 47}') |

+------------------------------------+

| [1, 2, {"id": 47}]                 |

+------------------------------------+

  

3.3.5 JSON_REMOVE

JSON_REMOVE(json_doc, path[, path] ...)
移除指定路径的数据,如果某个路径不存在则略过此路径。如果有参数为NULL,则返回NULL。

1

2

3

4

5

6

7

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。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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 JSON特性查询

3.4.1 JSON_DEEPTH

JSON_DEPTH(json_doc)

获取json文档的深度。如果参数为NULL,则返回NULL。

空的json array、json object或标量的深度为1。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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。 

长度的计算规则:

  • 标量的长度为1;
  • json array的长度为元素的个数;
  • json object的长度为key的个数。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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 |

+------------------------------------------------+

  

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。

1

2

3

4

5

6

7

8

9

10

11

12

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函数相关推荐

  1. MySQL常用时间函数

    本文转自:http://www.2cto.com/database/201307/230943.html MySQL常用时间函数 1.1 获得当前日期+时间(date + time)函数:now() ...

  2. mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数

    <Mysql实例详解Mysql中的JSON系列操作函数>要点: 本文介绍了Mysql实例详解Mysql中的JSON系列操作函数,希望对您有用.如果有疑问,可以联系我们. MYSQL必读前言 ...

  3. MySQL常用类型转换函数总结

    MySQL函数,常用类型转换函数总结 1.Concat函数. 连接字符串常用:concat函数.如sql查询条件的like查询, AND c.name like concat(#{param.name ...

  4. mysql的json函数

    mysql5.7以上提供了一种新的字段格式json,大概是mysql想把非关系型和关系型数据库一口通吃,所以推出了这种非常好用的格式,这样,我们的很多基于mongoDb或者clickHouse的业务都 ...

  5. mysql 常用聚合函数总结

    前言 聚合函数在工作中大量使用,比如常用的 sum求和函数,avg求平均值的函数等,本篇将mysql聚合函数相关的知识点做一些完整的总结: 数据准备 提前创建一张部门表和员工表,并插入若干数据 CRE ...

  6. mysql常用转换函数_MySQL中常用转换函数介绍

    Cast函数:CONVERT函数. 用法:CAST(expr AS type), CONVERT(expr,type) , CONVERT(expr USING transcoding_name). ...

  7. mysql常用的函数--group_concat

    mysql的常用函数--分组连接字段函数  group_concat 使用方法:select name `names`,GROUP_CONCAT(color) colors from group_co ...

  8. mysql常用的函数

    1.IF(expr1,expr2,expr3)函数: 如果 expr1 是TRUE ,则 IF()的返回值为expr2; 否则返回值则为 expr3. IF() 的返回值为数字值或字符串值,具体情况视 ...

  9. mysql常用系统函数归类

    数学函数 函数 作用 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) EXP(x) 返回值e(自然对数的底)的x次方 GREATEST(x1,x2, ...

最新文章

  1. iOS朋友圈,视频播放器、钓鱼小游戏、玻璃动画源码
  2. 程序员的弓箭知识涉猎
  3. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
  4. MySQL 8.0索引合并
  5. 内存超频trfc_这只是开始?四款DDR4内存超频效果对比
  6. ubuntu LVS+keepalived 笔记
  7. 微信之微信支付(封装)--jsapi
  8. [C#复习向整合]反射 -Assembly与Activator
  9. Python 与金融科技6|上证50的收盘价汇总
  10. 查找DOM,受控与非受控组件
  11. python多个箱线图_python-matplotlib | 箱线图及解读
  12. vue组件可视化_Vue HTML5音频可视化组件
  13. 前端面试题【131道】
  14. 我是怎么看friends练口语的(转贴)
  15. 困在赛博世界里的“仿生机器人”
  16. Qt linguist
  17. 数据结构实验一,第2题:基于顺序存储结构的图书信息表的排序
  18. linux复制jar文件,linux如何将界面上的一个JAR文件拷贝到ROOT下啊
  19. 用Bootstrap实现搜索select下拉框:bootstrap-select
  20. Thinking in Java----------并发篇章

热门文章

  1. LOJ6435【PKUSC2018】星际穿越题解(贪心+倍增)
  2. 双重for循环打印星号矩形,平行四边形,三角形规律总结
  3. Android代码规范_持续更新
  4. Flutter 根据图标工场网站 更改Android ios 桌面Logo
  5. 创建用户桌面进程(突破Session 0隔离)
  6. 如何禁用烦人的“insert”键
  7. Java验证码及登录中的漏洞分析
  8. 华为OD机试 - 几何平均值最大子数组(Java JS Python)
  9. 为何SAP适合纺织行业解决方案
  10. 「Bug」问题分析 RuntimeError: CUDA error: device-side assert triggered