MySQL常用Json函数

来源: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": "[email protected]", "name": "Amy"}',JSON);

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

CONVERT('{"mail": "[email protected]", "name": "Amy"}',JSON) |

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

| {"mail""[email protected]""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 |

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

你可能感兴趣的:(数据库)