CAST
语法声明
CAST(expr AS type)
说明
CAST() 将某种数据类型的表达式显式转换为另一种数据类型,即将 expr 字段值转换为 type 数据类型。
参数说明
参数解释如下:
-
expr:表示任何有效的 SQL 表达式。 -
AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。 -
type:表示目标系统所提供的数据类型。支持如下类型:-
CHAR[(N)] [CHARACTER SET charset_name]生成具有
CHAR数据类型的字符串。除了当表达式expr为空(长度为 0)时,结果 类型为CHAR(0)。如果指定了可选长度N,CHAR(N)会强制转换为使用不超过N个参数的字符,短于N个字符长度的值不会发生填充;如果没有指定可选长度N,seekdb 会根据表达式计算最大长度。如果没有CHARACTER SET charset_name子句,CHAR会生成具有默认字符集的字符串。 -
DATE:产生一个DATE值。 -
DATETIME [ (M) ]:产生一个DATETIME值。M值是可选的,用于指定小数位上秒的精度,范围为 [0,6]。 -
DECIMAL [ (M [,D] ) ]:产生一个DECIMAL值。M和D值是可选的,它们分别指定最大位数(精度)和小数点后的位数(小数位数)。M最大值为 65,D最大值为 30。如果省略D,则默认为0; 如果省略M,则默认为10。 -
SIGNED [INTEGER]:产生一个有符号的BIGINT值。 -
JSON:生成JSON值。有关 JSON 与其他类型的值转换规则,请参见 JSON 数据类型转换。 -
TIME [ (M) ]:产生一个TIME值。如果给出了可选的 M 值,则它指定小数位上秒的精度。 -
UNSIGNED [INTEGER]:产生一个无符号的BIGINT值。 -
DECIMAL(m,d):定点数类型,m表示总位数,d表示小数位数。 -
FLOAT:表示单精度浮点数,适 用于近似数值。 -
INT或INTEGER:表示 32 位有符号的整数。 -
SMALLINT:表示 16 位有符号的整数。 -
TINYINT:表示 8 位有符号整数。 -
ARRAY:用于将JSON数组中的元素转换为特定类型的数组。
-
使用说明
在使用 CAST 函数进行数据类型转换时,支持以下情况:
-
两个表达式的数据类型完全相同
-
两个表达式可隐式转换
-
必须显式转换数据类型
-
表达式 expr 的数值超过目标数据类型的数值范围时,类型转换会返回
null。 -
将高精度数据类型转换为低精度的数据类型,会丢失精度。
-
将定点数(
DECIMAL(m,d))、浮点数(DOUBLE、FLOAT)转换为整数(INT/INTEGER、SMALLINT或TINYINT),会丢失精度。 -
如果表达式 expr 是
VARCHAR类型,且不是数值,转换为INT/INTEGER、SMALLINT或TINYINT类型,返回结果为0。 -
如果表达式 expr 是 JSON 类型,且不是数值,转换为
INT/INTEGER、SMALLINT或TINYINT类型,返回报错。 -
如果
VARCHAR数据或JSON数据不符合ARRAY格式,转换时会报 错。
当用户试图进行不可能的转换,seekdb 将显示一条错误信息。如果转换时没有指定数据类型的长度,则使用 seekdb 系统内部最大长度。例如 VARCHAR 是 262,143 字节,NUMBER 是 65 比特位的浮动精度。
CAST() 支持带符号和无符号的 64 比特值的运算。如果您正在使用数字操作符 (例如 +) 而其中一个操作数为无符号整数,则结果为无符号。您可以使用 SIGNED 和 UNSIGNED 对结果进行显式声明,将运算分别指定为带符号或无符号的 64 比特位的整数。如果任意一个操作数为一个浮点值,则结果为一个浮点值。
示例
-
将数值 0 转换为
DATE类型。SELECT CAST(0 AS DATE);
+-----------------+
| CAST(0 AS DATE) |
+-----------------+
| 0000-00-00 |
+-----------------+
1 row in set (0.001 sec) -
将数值 123 转换为
TIME类型。SELECT CAST(123 AS TIME);
+-------------------+
| CAST(123 AS TIME) |
+-------------------+
| 00:01:23 |
+-------------------+
1 row in set -
将数值 123 转换为
DATETIME类型。SELECT CAST(123 AS DATETIME(4));
+--------------------------+
| CAST(123 AS DATETIME(4)) |
+--------------------------+
| 2000-01-23 00:00:00.0000 |
+--------------------------+
1 row in set -
将数值 123 转换为
DECIMAL类型。SELECT CAST(123 AS DECIMAL(3,2));
+---------------------------+
| CAST(123 AS DECIMAL(3,2)) |
+---------------------------+
| 9.99 |
+---------------------------+
1 row in set -
将字符串文本 "123" 转换为 JSON 类型。
SELECT CAST("123" AS JSON);
+---------------------+
| CAST("123" AS JSON) |
+---------------------+
| 123 |
+---------------------+
1 row in set -
将 "1-2"的结果分别使用无符号表示和有符号表示。
SELECT CAST(1-2 AS UNSIGNED), CAST(cast(1-2 AS UNSIGNED) AS SIGNED);
+-----------------------+---------------------------------------+
| CAST(1-2 AS UNSIGNED) | CAST(cast(1-2 AS UNSIGNED) AS SIGNED) |
+-----------------------+---------------------------------------+
| 18446744073709551615 | -1 |
+-----------------------+---------------------------------------+
1 row in set -
使用
CAST()进行数值运算。SELECT CAST(1 AS UNSIGNED) - 2.0;
+---------------------------+
| CAST(1 AS UNSIGNED) - 2.0 |
+---------------------------+
| -1.0 |
+---------------------------+
1 row in set -
将数值 123 转换为
CHAR类型。SELECT CAST(123 AS CHAR(2));
+----------------------+
| CAST(123 AS CHAR(2)) |
+----------------------+
| 12 |
+----------------------+
1 row in set -
将数值 1 转换为
CHAR类型并指定字符集。SELECT CAST(1 AS CHAR CHARACTER SET utf8mb4);
+---------------------------------------+
| CAST(1 AS CHAR CHARACTER SET utf8mb4) |
+---------------------------------------+
| 1 |
+---------------------------------------+
1 row in set -
将字符型
123转化为整型、整数1转化为INT类型。SELECT CAST('123' AS INT),CAST(1 AS CHAR(10));
+--------------------+---------------------+
| CAST('123' AS INT) | CAST(1 AS INT) |
+--------------------+---------------------+
| 123 | 1 |
+--------------------+---------------------+
1 row in set (0.035 sec -
将
JSON类型的数据[1,2,3]转换ARRAY数据,其中ARRAY数据由INT类型构成,语句如下:
SELECT CAST( JSON '[1,2,3]' AS ARRAY<int>);
+-------------------------------------+
| CAST( JSON '[1,2,3]' AS ARRAY<int> |
+-------------------------------------+
| [1,2,3] |
+-------------------------------------+
1 row in set (0.035 sec