Optimize json functions (#1177)
1. get_json_xxx() now support using quoto to escape dot 2. Implement json_path_prepare() function to preprocess json_path Performance of get_json_string() on 1000000 rows reduces from 2.27s to 0.27s
This commit is contained in:
@ -0,0 +1,47 @@
|
||||
# get_json_double
|
||||
|
||||
## Syntax
|
||||
|
||||
`DOUBLE get_json_double(VARCHAR json_str, VARCHAR json_path)
|
||||
|
||||
## Description
|
||||
|
||||
解析并获取 json 字符串内指定路径的浮点型内容。
|
||||
其中 json_path 必须以 $ 符号作为开头,使用 . 作为路径分割符。如果路径中包含 . ,则可以使用双引号包围。
|
||||
使用 [ ] 表示数组下标,从 0 开始。
|
||||
path 的内容不能包含 ", [ 和 ]。
|
||||
如果 json_string 格式不对,或 json_path 格式不对,或无法找到匹配项,则返回 NULL。
|
||||
|
||||
## Examples
|
||||
|
||||
1. 获取 key 为 "k1" 的 value
|
||||
|
||||
```
|
||||
mysql> SELECT get_json_double('{"k1":1.3, "k2":"2"}', "$.k1");
|
||||
+-------------------------------------------------+
|
||||
| get_json_double('{"k1":1.3, "k2":"2"}', '$.k1') |
|
||||
+-------------------------------------------------+
|
||||
| 1.3 |
|
||||
+-------------------------------------------------+
|
||||
```
|
||||
|
||||
2. 获取 key 为 "my.key" 的数组中第二个元素
|
||||
|
||||
```
|
||||
mysql> SELECT get_json_double('{"k1":"v1", "my.key":[1.1, 2.2, 3.3]}', '$."my.key"[1]');
|
||||
+---------------------------------------------------------------------------+
|
||||
| get_json_double('{"k1":"v1", "my.key":[1.1, 2.2, 3.3]}', '$."my.key"[1]') |
|
||||
+---------------------------------------------------------------------------+
|
||||
| 2.2 |
|
||||
+---------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
3. 获取二级路径为 k1.key -> k2 的数组中,第一个元素
|
||||
```
|
||||
mysql> SELECT get_json_double('{"k1.key":{"k2":[1.1, 2.2]}}', '$."k1.key".k2[0]');
|
||||
+---------------------------------------------------------------------+
|
||||
| get_json_double('{"k1.key":{"k2":[1.1, 2.2]}}', '$."k1.key".k2[0]') |
|
||||
+---------------------------------------------------------------------+
|
||||
| 1.1 |
|
||||
+---------------------------------------------------------------------+
|
||||
```
|
||||
@ -0,0 +1,47 @@
|
||||
# get_json_int
|
||||
|
||||
## Syntax
|
||||
|
||||
`INT get_json_int(VARCHAR json_str, VARCHAR json_path)
|
||||
|
||||
## Description
|
||||
|
||||
解析并获取 json 字符串内指定路径的整型内容。
|
||||
其中 json_path 必须以 $ 符号作为开头,使用 . 作为路径分割符。如果路径中包含 . ,则可以使用双引号包围。
|
||||
使用 [ ] 表示数组下标,从 0 开始。
|
||||
path 的内容不能包含 ", [ 和 ]。
|
||||
如果 json_string 格式不对,或 json_path 格式不对,或无法找到匹配项,则返回 NULL。
|
||||
|
||||
## Examples
|
||||
|
||||
1. 获取 key 为 "k1" 的 value
|
||||
|
||||
```
|
||||
mysql> SELECT get_json_int('{"k1":1, "k2":"2"}', "$.k1");
|
||||
+--------------------------------------------+
|
||||
| get_json_int('{"k1":1, "k2":"2"}', '$.k1') |
|
||||
+--------------------------------------------+
|
||||
| 1 |
|
||||
+--------------------------------------------+
|
||||
```
|
||||
|
||||
2. 获取 key 为 "my.key" 的数组中第二个元素
|
||||
|
||||
```
|
||||
mysql> SELECT get_json_int('{"k1":"v1", "my.key":[1, 2, 3]}', '$."my.key"[1]');
|
||||
+------------------------------------------------------------------+
|
||||
| get_json_int('{"k1":"v1", "my.key":[1, 2, 3]}', '$."my.key"[1]') |
|
||||
+------------------------------------------------------------------+
|
||||
| 2 |
|
||||
+------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
3. 获取二级路径为 k1.key -> k2 的数组中,第一个元素
|
||||
```
|
||||
mysql> SELECT get_json_int('{"k1.key":{"k2":[1, 2]}}', '$."k1.key".k2[0]');
|
||||
+--------------------------------------------------------------+
|
||||
| get_json_int('{"k1.key":{"k2":[1, 2]}}', '$."k1.key".k2[0]') |
|
||||
+--------------------------------------------------------------+
|
||||
| 1 |
|
||||
+--------------------------------------------------------------+
|
||||
```
|
||||
@ -0,0 +1,57 @@
|
||||
# get_json_string
|
||||
|
||||
## Syntax
|
||||
|
||||
`VARCHAR get_json_string(VARCHAR json_str, VARCHAR json_path)
|
||||
|
||||
## Description
|
||||
|
||||
解析并获取 json 字符串内指定路径的字符串内容。
|
||||
其中 json_path 必须以 $ 符号作为开头,使用 . 作为路径分割符。如果路径中包含 . ,则可以使用双引号包围。
|
||||
使用 [ ] 表示数组下标,从 0 开始。
|
||||
path 的内容不能包含 ", [ 和 ]。
|
||||
如果 json_string 格式不对,或 json_path 格式不对,或无法找到匹配项,则返回 NULL。
|
||||
|
||||
## Examples
|
||||
|
||||
1. 获取 key 为 "k1" 的 value
|
||||
|
||||
```
|
||||
mysql> SELECT get_json_string('{"k1":"v1", "k2":"v2"}', "$.k1");
|
||||
+---------------------------------------------------+
|
||||
| get_json_string('{"k1":"v1", "k2":"v2"}', '$.k1') |
|
||||
+---------------------------------------------------+
|
||||
| v1 |
|
||||
+---------------------------------------------------+
|
||||
```
|
||||
|
||||
2. 获取 key 为 "my.key" 的数组中第二个元素
|
||||
|
||||
```
|
||||
mysql> SELECT get_json_string('{"k1":"v1", "my.key":["e1", "e2", "e3"]}', '$."my.key"[1]');
|
||||
+------------------------------------------------------------------------------+
|
||||
| get_json_string('{"k1":"v1", "my.key":["e1", "e2", "e3"]}', '$."my.key"[1]') |
|
||||
+------------------------------------------------------------------------------+
|
||||
| e2 |
|
||||
+------------------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
3. 获取二级路径为 k1.key -> k2 的数组中,第一个元素
|
||||
```
|
||||
mysql> SELECT get_json_string('{"k1.key":{"k2":["v1", "v2"]}}', '$."k1.key".k2[0]');
|
||||
+-----------------------------------------------------------------------+
|
||||
| get_json_string('{"k1.key":{"k2":["v1", "v2"]}}', '$."k1.key".k2[0]') |
|
||||
+-----------------------------------------------------------------------+
|
||||
| v1 |
|
||||
+-----------------------------------------------------------------------+
|
||||
```
|
||||
|
||||
4. 获取数组中,key 为 "k1" 的所有 value
|
||||
```
|
||||
mysql> SELECT get_json_string('[{"k1":"v1"}, {"k2":"v2"}, {"k1":"v3"}, {"k1":"v4"}]', '$.k1');
|
||||
+---------------------------------------------------------------------------------+
|
||||
| get_json_string('[{"k1":"v1"}, {"k2":"v2"}, {"k1":"v3"}, {"k1":"v4"}]', '$.k1') |
|
||||
+---------------------------------------------------------------------------------+
|
||||
| ["v1","v3","v4"] |
|
||||
+---------------------------------------------------------------------------------+
|
||||
```
|
||||
Reference in New Issue
Block a user