JSON 数据类型转换
seekdb 支持使用 CAST 函数实现其他类型的数据和 JSON 数据类型的相互转换。
JSON 数据类型的转换规则如下表所示。
| 其他数据类型 | CAST(other_type AS JSON) | CAST(JSON AS other_type) |
|---|---|---|
| JSON | 没有变化 | 没有变化 |
| utf8 字符类型 (包括 utf8mb4、utf8 和 ascii) | 字符被转换为 JSON 类型值,并验证合法性。 | 序列化成 utf8mb4 字符串。 |
| 其他字符集类型 | 首先转换成为 utf8mb4 字符编码,之后再按照 utf8 字符类型的描述进行转换。 | 首先序列化成 utf8mb4 编码的字符串,之后再转换成对应字符集的字符串。 |
| NULL | 返回空 JSON 类型值。 | 不适用 |
| 其他类型 | 只有单个的标量值会被转换为一个只具备单独值的 JSON 类型值。 | 如果 JSON 类型值只包含一个标量值,并且与目标类型吻合,则会被转换为对应的类型,否则返回 NULL,并告警。 |
信息
other_type 指定除 JSON 外的其它数据类型。
如下为一些转换示例。
obclient> SELECT CAST("123" AS JSON);
+---------------------+
| CAST("123" AS JSON) |
+---------------------+
| 123 |
+---------------------+
1 row in set
obclient> SELECT CAST(null AS JSON);
+--------------------+
| CAST(null AS JSON) |
+--------------------+
| NULL |
+--------------------+
1 row in set
CREATE TABLE tj1 (c1 JSON,c2 VARCHAR(20));
INSERT INTO tj1 VALUES ('{"id": 17, "color": "red"}','apple'),('{"id": 18, "color": "yellow"}', 'banana'),('{"id": 16, "color": "orange"}','orange');
obclient> SELECT * FROM tj1 ORDER BY CAST(JSON_EXTRACT(c1, '$.id') AS UNSIGNED);
+-------------------------------+--------+
| c1 | c2 |
+-------------------------------+--------+
| {"id": 16, "color": "orange"} | orange |
| {"id": 17, "color": "red"} | apple |
| {"id": 18, "color": "yellow"} | banana |
+-------------------------------+--------+
3 rows in set