AnalyticDB MySQL版
支持通过
cast
函数来转换数据类型。本文介绍如何使用
cast
函数。
语法
cast(expr AS type)
-
expr
:源数据,如字符串'China'
。 -
type
:目标数据类型,例如varbinary
。
CAST AS BOOLEAN
cast (expr AS boolean)
命令说明
将源数据
expr
转换为BOOLEAN类型。
源数据类型
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- BIGINT
- DOUBLE
- VARCHAR
- JSON
注意事项
-
源VARCHAR类型或JSON类型的数据转换为BOOLEAN类型时,会出现如下几种情况:
- 源数据为true或1,会被转换成1。
- 源数据为false或0,会被转换成0。
- 源数据为其他,转换时返回NULL。
例如,将VARCHAR类型的数据a
转换为BOOLEAN类型,语句如下:
此时会返回:SELECT cast('a' AS boolean);
NULL
-
源DOUBLE类型的数据转换为BOOLEAN类型时,会出现如下几种情况:
- 非0.0数值会被转换成1。
- 0.0会被转换成0。
例如,将源DOUBLE的数据类型4.3
转换为BOOLEAN类型,语句如下:
返回结果如下:SELECT cast(4.3 AS boolean);
+----------------------+ | cast(4.3 AS boolean) | +----------------------+ | 1 | +----------------------+
-
源DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT或BIGINT类型的数据,转换为BOOLEAN类型时,会出现如下几种情况:
- 非0数值会被转换成1。
- 0会被转换成0。
例如,将源INT的数据类型5
转换为BOOLEAN类型,语句如下:
返回结果如下:SELECT cast(5 AS boolean);
+--------------------+ | cast(5 AS boolean) | +--------------------+ | 1 | +--------------------+
示例
1
转换为BOOLEAN,语句如下:
SELECT cast('1' AS boolean);
返回结果如下:
+----------------------+
| cast('1' AS boolean) |
+----------------------+
| 1 |
+----------------------+
CAST AS DECIMAL(m,d)|FLOAT|INT/INTEGER|SMALLINT|TINYINT
cast (expr AS decimal(m,d)|float|int/integer|smallint|tinyint)
命令说明
将源数据
expr
转换为DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT或TINYINT类型。
源数据类型
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- BIGINT
- DOUBLE
- VARCHAR
- JSON
注意事项
-
若源类型数值超出了目标类型支持的数值范围,类型转换时会报错。
例如,将BIGINT类型的数据
99999999
转换成SMALLINT类型,语句如下:
由于SELECT cast(99999999 as smallint);
99999999
不在SMALLINT支持的数值范围内,此时会返回NULL。NULL
-
在如下类型转换的场景中,转换后数据精度会丢失。
-
DOUBLE类型转换为FLOAT类型。
将源DOUBLE类型的数据
1.23456789
转换为FLOAT类型,语句如下:
返回结果如下:SELECT cast(1.23456789 AS float);
+---------------------------+ | cast(1.23456789 AS float) | +---------------------------+ | 1.2345679 | +---------------------------+
-
DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT或TINYINT类型间互相转换。
例如,将源FLOAT类型的数据
1.1342
转换为INT类型,语句如下:
返回结果如下:SELECT cast(1.1342 AS int);
+---------------------+ | cast(1.1342 AS int) | +---------------------+ | 1 | +---------------------+
-
DOUBLE类型转换为FLOAT类型。
-
若源VARCHAR类型的数据不是数值,转换为DECIMAL(m,d)或FLOAT类型时会返回NULL。
例如,将源VARCHAR类型的数据
China
转换为DECIMAL(m,d)类型,语句如下:
返回结果如下:SELECT cast( 'China' AS decimal(5,2));
NULL
-
若源VARCHAR类型的数据不是数值,转换为INT/INTEGER、SMALLINT或TINYINT类型后的结果均为0。
例如,将源VARCHAR类型的数据
China
转换为SMALLINT类型,语句如下:
返回结果如下:SELECT cast( 'China' AS smallint);
+----------------------------+ | cast( 'China' AS smallint) | +----------------------------+ | 0 | +----------------------------+
-
若源JSON类型的数据不是数值,转换为DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT或TINYINT时会报错。
例如,将源VARCHAR类型的数据
[1,2,3]
先转换为JSON数据,再转换为SMALLINT类型,语句如下:
此时会返回如下错误:SELECT cast(cast('[1,2,3]' AS json) AS smallint);
ERROR 1815 (HY000): [20034, 2021091814103119216818804803453190138] : Cannot cast json to smallint
示例
2001012
转换为FLOAT类型,语句如下:
SELECT cast( 2001012 AS float);
返回结果如下:
+-------------------------+
| cast( 2001012 AS float) |
+-------------------------+
| 2001012.0 |
+-------------------------+
CAST AS BIGINT
cast (expr AS bigint)
命令说明
将源数据
expr
转换为BIGINT类型。
源数据类型
- BOOLEAN
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- DOUBLE
- DATE、DATETIME、TIMESTAMP、TIME
- VARCHAR
注意事项
-
若源VARCHAR类型的数据不是数值,转换为BIGINT类型后的结果均为0。
例如,将源VARCHAR类型的数据
a
转换为BIGINT,语句如下:
返回结果如下:SELECT cast('a' AS bigint);
+---------------------+ | cast('a' AS bigint) | +---------------------+ | 0 | +---------------------+
-
在如下类型转换的场景中,转换后数据精度会丢失。
-
DOUBLE类型转换为BIGINT类型。
将源DOUBLE类型的数据
1.23456789
转换为BIGINT类型,语句如下:
返回结果如下:SELECT cast(1.23456789 AS bigint);
+----------------------------+ | cast(1.23456789 AS bigint) | +----------------------------+ | 1 | +----------------------------+
-
DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT或TINYINT类型的数据转换为BIGINT类型。
例如,将DECIMAL类型的数据
1.1
转换为BIGINT类型,语句如下:
返回结果如下:SELECT cast(1.1 AS bigint);
+---------------------+ | cast(1.1 AS bigint) | +---------------------+ | 1 | +---------------------+
-
DOUBLE类型转换为BIGINT类型。
-
若源JSON类型的数据不是数值,转换为BIGINT类型时会返回NULL。
例如,将源JSON类型的数据
{}
转换为BIGINT类型,语句如下:
返回结果如下:SELECT cast(json'{}'AS bigint);
NULL
示例
-
将源DATE类型的数据
2021-09-18
转换为BIGINT类型,语句如下:
返回结果如下:SELECT cast(date '2021-09-18' AS bigint);
+-----------------------------------+ | cast(date '2021-09-18' AS bigint) | +-----------------------------------+ | 20210918 | +-----------------------------------+
-
将源JSON类型的数据
-1
转换为BIGINT类型,语句如下:
返回结果如下:SELECT cast(json '-1' AS bigint);
+---------------------------+ | cast(json '-1' AS bigint) | +---------------------------+ | -1 | +---------------------------+
-
将源DOUBLE类型的数据
floor(4/5)
转换为BIGINT类型,语句如下:
返回结果如下:SELECT cast(floor(4/5) as bigint);
+---------------------------+ |cast(floor(4/5) as bigint) | +---------------------------+ | 0 | +---------------------------+
CAST AS DOUBLE
cast (expr AS double)
命令说明
将源数据
expr
转换为DOUBLE类型。
数据源类型
- BOOLEAN
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- BIGINT
- DATE、DATETIME、TIMESTAMP、TIME
- VARCHAR
- JSON
注意事项
-
若源VARCHAR类型的数据不是数值,转换为DOUBLE类型后的结果均为0.0。
例如,将源VARCHAR类型的数据
China
转换为DOUBLE类型,语句如下:
返回结果如下:SELECT cast( 'China' AS double);
+--------------------------+ | cast( 'China' AS double) | +--------------------------+ | 0.0 | +--------------------------+
-
若源JSON类型的数据不是数值,转换为DOUBLE时会返回NULL。
例如,将源JSON类型的数据
{}
转换为DOUBLE类型,语句如下:
返回结果如下:SELECT cast(json '{}' AS double);
NULL
示例
2021-09-17
转换为DOUBLE类型,语句如下:
SELECT cast( date '2021-09-17' AS double);
返回结果如下:
+------------------------------------+
| cast( date '2021-09-17' AS double) |
+------------------------------------+
| 2.0210917E7 |
+------------------------------------+
CAST AS DATE|DATETIME|TIMESTAMP|TIME
cast (expr AS date|datetime|timestamp|time)
命令说明
将源数据
expr
转换为DATE、DATETIME、TIMESTAMP或TIME类型。
源数据类型
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- BIGINT
- DOUBLE
- DATE、DATETIME、TIMESTAMP、TIME
- VARCHAR
- JSON
注意事项
-
若源VARCHAR类型或源BIGINT类型的数据不符合时间类型格式,转换后的结果均为NULL。
例如,将源VARCHAR类型的数据
a
转换为TIME类型,语句如下:
由于格式不匹配会返回NULL,结果如下:SELECT cast('a' AS time);
+-------------------+ | cast('a' AS time) | +-------------------+ | NULL | +-------------------+
-
若目标数据类型包含日期和时间数据,但源数据缺少对应的信息,那么将根据如下规则自动补充数据:
-
若源数据中缺失时间信息,转换后的时间默认为
00:00:00
。例如,将TIMSTAMP类型的数据2001-1-22
转换为TIME类型,语句如下:
由于缺少时间信息,默认返回SELECT cast(timestamp '2001-1-22' AS time);
00:00:00
,结果如下:+-------------------------------------+ | cast(timestamp '2001-1-22' AS time) | +-------------------------------------+ | 00:00:00 | +-------------------------------------+
-
若源数据中缺失日期信息,默认转换后的日期为执行该查询时该客户端的系统日期。
例如,将TIME类型的数据
00:00:00
转换为DATE类型,语句如下:
由于缺少日期信息,默认执行该查询时的系统日期,结果如下:SELECT cast(time '00:00:00' AS date);
+-------------------------------+ | cast(time '00:00:00' AS date) | +-------------------------------+ | 2021-09-14 | +-------------------------------+
-
若源数据中缺失时间信息,转换后的时间默认为
示例
20010122000000
转换成DATE类型,语句如下:
SELECT cast(20010122000000 AS date);
返回结果如下:
+------------------------------+
| cast(20010122000000 AS date) |
+------------------------------+
| 2001-01-22 |
+------------------------------+
CAST AS VARBINARY
cast (expr AS varbinary)
命令说明
将源数据
expr
转换为VARBINARY类型。
源数据类型
- BOOLEAN
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- BIGINT
- DOUBLE
- DATE、DATETIME、TIMESTAMP、TIME
- VARCHAR
- JSON
示例
CHINA
转换为VARBINARY类型,语句如下:
SELECT cast('CHINA' AS varbinary);
返回结果如下:
+--------------------------------------------------------+
| cast('CHINA' AS varbinary) |
+--------------------------------------------------------+
| 0x4348494E41 |
+--------------------------------------------------------+
CAST AS VARCHAR
cast (expr AS varchar)
命令说明
将源数据
expr
转换为VARCHAR类型。
源数据类型
- BOOLEAN
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- BIGINT
- DOUBLE
- DATE、DATETIME、TIMESTAMP、TIME
-
VARBINARY
说明 仅3.1.4及以上版本的 AnalyticDB MySQL版 集群,支持通过CAST函数将VARBINARY类型转换为VARCHAR类型。
- ARRAY
- MAP
- JSON
示例
2001-1-22 00:00:00
转换为VARCHAR类型,语句如下:
SELECT cast(timestamp '2001-1-22 00:00:00' AS varchar);
返回结果如下:
+-------------------------------------------------+
| cast(timestamp '2001-1-22 00:00:00' AS varchar) |
+-------------------------------------------------+
| 2001-01-22 00:00:00 |
+-------------------------------------------------+
CAST AS ARRAY
cast (expr AS array<element_type>)
命令说明
将源数据
expr
转换为ARRAY数据,其中ARRAY数据由指定数据类型
<element_type>
构成。
输入值类型
-
expr
:VARCHAR或JSON类型。 -
<element_type>
:TINYINT、SMALLINT、INT/INTEGER或FLOAT类型。
注意事项
若源VARCHAR数据或JSON数据不符合ARRAY格式,转换时会报错。
{}}
转换ARRAY数据,其中ARRAY数据由FLOAT类型构成,语句如下:
SELECT cast('{}}' AS array<float>);
由于格式不匹配,会提示如下错误:
ERROR 1815 (HY000): [30013, 2021091815372119216818804803453204662] : Value cannot be cast to array(real)
示例
[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] |
+-------------------------------------+
CAST AS MAP
cast (expr AS map<element_type_1,element_type_2>)
命令说明
将源数据
expr
转换为MAP数据,该MAP会将
<element_type_1>
类型的数据映射为
<element_type_2>
类型。
输入值类型
-
expr
:VARCHAR类型。 -
<element_type_1>
:BOOLEAN、DECIMAL、DOUBLE、FLOAT、BIGINT、INT/INTEGER、SMALLINT、TINYINT、VARCHAR类型。 -
<element_type_2>
:BOOLEAN、DECIMAL、DOUBLE、FLOAT、BIGINT、INT/INTEGER、SMALLINT、TINYINT、VARCHAR、ARRAY、JSON、MAP类型。
注意事项
若源VARCHAR类型的数据不符合MAP格式,转换时会报错。
[a,b,c]
转换为MAP类型,语句如下:
SELECT cast('[a,b,c]' AS map<varchar,varchar>);
此时会返回如下错误:
ERROR 1815 (HY000): [30013, 2021091815562519216818804803453207833] : Value cannot be cast to map(varchar,varchar)
示例
{"1":"a"}
转换为MAP数据,该MAP会将一个VARCHAR类型数据映射为VARCHAR,语句如下:
SELECT cast('{"1":"a"}' AS map<varchar,varchar>);
返回结果如下:
+-------------------------------------------+
| cast('{"1":"a"}' AS map<varchar,varchar>) |
+-------------------------------------------+
| {"1":"a"} |
+-------------------------------------------+
CAST AS JSON
cast (expr AS json)
命令说明
将源数据
expr
转换为JSON类型。
源数据类型
- BOOLEAN
- DECIMAL(m,d)、FLOAT、INT/INTEGER、SMALLINT、TINYINT
- BIGINT
- DOUBLE
- VARCHAR
- ARRAY
注意事项
若源VARCHAR类型的数据不符合JSON格式,转换时会返回NULL。
{}}
转换成JSON类型,语句如下:
SELECT cast('{}}' AS json);
返回结果如下:
NULL
示例
-
将VARCHAR类型的数据
{}
转换为JSON类型,语句如下:
返回结果如下:SELECT cast('{}' AS json);
+--------------------+ | cast('{}' AS json) | +--------------------+ | {} | +--------------------+
-
将BIGINT类型的数据
0
转换成JSON类型,语句如下:
返回结果如下:SELECT cast( bigint '0' AS json);
+---------------------------+ | cast( bigint '0' AS json) | +---------------------------+ | 0 | +---------------------------+