跳到主要内容

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)。如果指定了可选长度 NCHAR(N) 会强制转换为使用不超过 N 个参数的字符,短于 N 个字符长度的值不会发生填充;如果没有指定可选长度 N,seekdb 会根据表达式计算最大长度。如果没有 CHARACTER SET charset_name 子句,CHAR 会生成具有默认字符集的字符串。

    • DATE:产生一个 DATE 值。

    • DATETIME [ (M) ]:产生一个 DATETIME 值。M 值是可选的,用于指定小数位上秒的精度,范围为 [0,6]。

    • DECIMAL [ (M [,D] ) ]:产生一个 DECIMAL 值。MD 值是可选的,它们分别指定最大位数(精度)和小数点后的位数(小数位数)。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:表示单精度浮点数,适用于近似数值。

    • INTINTEGER:表示 32 位有符号的整数。

    • SMALLINT:表示 16 位有符号的整数。

    • TINYINT:表示 8 位有符号整数。

    • ARRAY:用于将 JSON 数组中的元素转换为特定类型的数组。

使用说明

在使用 CAST 函数进行数据类型转换时,支持以下情况:

  • 两个表达式的数据类型完全相同

  • 两个表达式可隐式转换

  • 必须显式转换数据类型

  • 表达式 expr 的数值超过目标数据类型的数值范围时,类型转换会返回 null

  • 将高精度数据类型转换为低精度的数据类型,会丢失精度。

  • 将定点数(DECIMAL(m,d))、浮点数(DOUBLEFLOAT)转换为整数(INT/INTEGERSMALLINTTINYINT),会丢失精度。

  • 如果表达式 expr 是 VARCHAR 类型,且不是数值,转换为 INT/INTEGERSMALLINTTINYINT 类型,返回结果为0

  • 如果表达式 expr 是 JSON 类型,且不是数值,转换为 INT/INTEGERSMALLINTTINYINT 类型,返回报错。

  • 如果 VARCHAR 数据或 JSON 数据不符合 ARRAY 格式,转换时会报错。

当用户试图进行不可能的转换,seekdb 将显示一条错误信息。如果转换时没有指定数据类型的长度,则使用 seekdb 系统内部最大长度。例如 VARCHAR 是 262,143 字节,NUMBER 是 65 比特位的浮动精度。

CAST() 支持带符号和无符号的 64 比特值的运算。如果您正在使用数字操作符 (例如 +) 而其中一个操作数为无符号整数,则结果为无符号。您可以使用 SIGNEDUNSIGNED 对结果进行显式声明,将运算分别指定为带符号或无符号的 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