1. 新特性
在Mysql中,JSON操作符允许用户对JSON数据类型的列中执行各种操作:操作符‘->’用于从JSON对象中提取一个特定的键的值。例如,json_column -> ‘$.key’将返回JSON对象中为‘key’的值;操作符‘->>’与操作符’->’类似,但返回的是提取值的字符串表示,例如,json_column ->> ‘$.key’将返回键为‘key’的值作为字符串。
在KingbaseES最新版本中,我们兼容了MySQL中的‘->’操作符以及‘->>’操作符,通过使用这些操作符,用户可以方便地在JSON数据类型的列中执行各种操作。
2. 新兼容JSON操作符
2.1 ‘->’操作符
2.1.1 操作符语法
操作符语法
|
左操作数类型
|
右操作数类型
|
返回类型
|
索引
|
json-> path
|
json类型
|
jsonpath类型
|
json类型
|
不支持
|
2.1.2
功能描述
‘->’操作符其实是函数JSON_EXTRACT只有两个参数时的别名,其功能是返回json文档中指定path对应的值。JSON_EXTRACT(json_doc,path[,path]…)函数可以有多个path,而‘->’操作符只能指定一个path。且不支持索引:
Mysql> create index t_idx_a on t ((a->'$.a'));
ERROR 3753 (42000): Cannot create a functional index on a function that returns a JSON or GEOMETRY value.
|
2.1.3 功能举例
Mysql > select * from jsontest;
+------------------------+
| json |
+------------------------+
| {“a”:”b”} |
| [1, 2, ,3] |
+------------------------+
Mysql > select json -> ‘$.a’ from jsontest;
+------------------------+
| json -> ‘$.a’ |
--------------------------
| “b” |
| NULL |
+------------------------+
Mysql > select json -> ‘$.a’ from jsontest;
+------------------------+
| json -> ‘$[0]’ |
--------------------------
| {“a”:”b”} |
| 1 |
+------------------------+
|
2.2 ‘->>’操作符
2.2.1 操作符语法
操作符语法
|
左操作数类型
|
右操作数类型
|
返回类型
|
索引
|
json->> path
|
json类型
|
jsonpath类型
|
字符串
|
不支持
|
2.2.2
功能描述
‘->>’操作符是‘->’操作符的扩展,以字符串形式返回指定json文档中指定path对应的值,并取消引用。等同于将‘->’操作符所得结果以字符串形式返回。也可用JSON_UNQUOTE( JSON_EXTRACT(json, path) )函数表示。且不支持索引:
Mysql> create index t_idx_a on t ((a->>'$.a'));
ERROR 3757 (HY000): Cannot create a functional index on an expression that returns a BLOB or TEXT. Please consider using CAST.
|
下面3中形式将返回相同的值:
l JSON_UNQUOTE( JSON_EXTRACT(json, path) )
l JSON_UNQUOTE(json -> path)
l json->>path
2.2.3 功能举例
Mysql > select * from jsontest;
+------------------------+
| json |
+------------------------+
| {“a”:”b”} |
| [1, 2, ,3] |
+------------------------+
Mysql > select json ->> ‘$.a’ from jsontest;
+------------------------+
| json -> ‘$.a’ |
---------------------------
| b |
| NULL |
+------------------------+
Mysql > select json ->> ‘$.a’ from jsontest;
+-------------------------+
| json -> ‘$[0]’ |
---------------------------
| {“a”:”b”} |
| 1 |
+-------------------------+
|
3. 金仓数据库KingbaseES的实现方式
在金仓数据库中,上述两种操作符在插件mysql_json中实现,用户在使用时需要在mysql模式下create插件:
test=# show database_mode;
database_mode
---------------
mysql
(1 row)
test=# create extension mysql_json ;
CREATE EXTENSION
|
之后用户可以如同MySQL一样,对JSON列使用操作符进行操作。