首批通过分布式安全可靠测评,为关键业务系统打造
CAST
更新时间:2026-04-05 11:39:03
描述
该函数用于将一种内置数据类型转换为另一种内置数据类型。
语法
CAST ({ expr | MULTISET (subquery) } AS type_name )
参数解释
| 参数 | 说明 |
|---|---|
| expr | 列名或者表达式。 |
| MULTISET | 如果 subquery 的结果集可以为多行,则必须指定 MULTISET 关键字。CAST(MULTISET (subquery) ) AS 的结果是集合类型,子查询产生的行被转换为对应的集合元素。如果没有 MULTISET 关键字,子查询将被视为标量子查询。 |
| AS | 用于分隔两个参数,在 AS 之前的是要处理的数据,在 AS 之后是要转换的数据类型。 |
| type_name | OceanBase 数据库的内建数据类型名称。 |
返回类型
返回与 type_name 相同的类型。
下表显示了哪些数据类型可以转换为其他内置数据类型:
| from BINARY_FLOAT, BINARY_DOUBLE | from CHAR, VARCHAR2 | from NUMBER | from DATETIME/INTERVAL | from RAW | from NCHAR, NVARCHAR2 | |
|---|---|---|---|---|---|---|
| to BINARY_FLOAT, BINARY_DOUBLE | yes | yes | yes | no | no | yes |
| to CHAR, VARCHAR2 | yes | yes | yes | yes | yes | no |
| to NUMBER | yes | yes | yes | no | no | yes |
| to DATETIME, INTERVAL | no | yes | no | yes | no | no |
| to RAW | yes | yes | yes | no | yes | no |
| to NCHAR, NVARCHAR2 | yes | no | yes | yes | yes | yes |
说明
to DATETIME/INTERVAL 数据类型包括 DATE、TIMESTAMP、TIMESTAMP WITH TIMEZONE、INTERVAL DAY TO SECOND 和 INTERVAL YEAR TO MONTH。
示例
如下示例分别将字符型 123 转化为整型、整数 1 转化为 VARCHAR2(10) 类型、将 22-OCT-2021 转化为 TIMESTAMP WITH LOCAL TIME ZONE 类型。
obclient> SELECT CAST('123' AS INT),CAST(1 AS VARCHAR2(10)),CAST('22-OCT-2021' AS TIMESTAMP WITH LOCAL TIME ZONE)
AS RESULT FROM DUAL;
+------------------+-----------------------+------------------------------+
| CAST('123'ASINT) | CAST(1ASVARCHAR2(10)) | RESULT |
+------------------+-----------------------+------------------------------+
| 123 | 1 | 22-OCT-21 12.00.00.000000 AM |
+------------------+-----------------------+------------------------------+
1 row in set
说明
在转换日期类型的数据时此函数会受 NLS_DATE_FORMAT 参数的影响,建议先执行如下语句更改 NLS_DATE_FORMAT 格式:ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
如下示例为在 Table Function 里使用 MULTISET 获取集合类型的结果。
obclient> CREATE OR REPLACE TYPE tbl_int AS TABLE OF INT;
Query OK, 0 rows affected
obclient> CREATE TABLE t1(c1 INT, c2 INT);
Query OK, 0 rows affected
obclient> CREATE TABLE t2(c1 INT, c2 INT);
Query OK, 0 rows affected
obclient> INSERT INTO t1 VALUES (1,1);
Query OK, 1 row affected
obclient> INSERT INTO t2 VALUES (1,2);
Query OK, 1 row affected
obclient> INSERT INTO t2 VALUES (1,3);
Query OK, 1 row affected
obclient> SELECT * FROM t1,TABLE(CAST(MULTISET(SELECT t2.c2 FROM t2 WHERE t1.c1=t2.c1) AS tbl_int));
+------+------+--------------+
| C1 | C2 | COLUMN_VALUE |
+------+------+--------------+
| 1 | 1 | 2 |
| 1 | 1 | 3 |
+------+------+--------------+