TDengine 转化类函数 CAST 用户手册
TDengine CAST 函数用户手册
概述
CAST 函数是 TDengine 中的数据类型转换函数,用于将表达式的值从一种数据类型转换为另一种数据类型。该函数在数据处理、格式化输出、类型统一等场景中发挥重要作用。
语法
CAST(expr AS type_name)
参数说明
参数 | 类型 | 必需 | 描述 |
---|---|---|---|
expr | 表达式 | 是 | 要转换的源表达式,可以是列名、常量、函数结果等 |
type_name | 数据类型 | 是 | 目标数据类型,支持 TDengine 的大部分数据类型 |
返回值类型
返回类型:type_name
参数指定的数据类型
支持的数据类型
输入类型(expr)
支持除以下类型外的所有 TDengine 数据类型:
- ❌ JSON
- ❌ VARBINARY(仅当目标类型为 VARBINARY 时例外)
输出类型(type_name)
支持 TDengine 的所有数据类型,包括:
- 数值类型:
TINYINT
、SMALLINT
、INT
、BIGINT
、FLOAT
、DOUBLE
、DECIMAL
- 字符串类型:
VARCHAR(n)
、NCHAR(n)
、BINARY(n)
- 时间类型:
TIMESTAMP
- 布尔类型:
BOOL
- 几何类型:
GEOMETRY
- 二进制类型:
VARBINARY(n)
特殊限制
- 当
type_name
为VARBINARY
时,expr
只能是VARCHAR
类型 DECIMAL
类型不支持与JSON
、VARBINARY
、GEOMETRY
类型的互转
适用范围
- 表类型:支持普通表和超级表
- 嵌套查询:支持内层查询和外层查询
- 版本要求:TDengine 3.0+
使用场景
1. 数据类型统一
在多表关联查询时,统一不同表中相同含义但类型不同的字段。
-- 统一不同表中ID字段的类型
SELECT CAST(user_id AS BIGINT) as id, name
FROM user_table
UNION ALL
SELECT CAST(customer_id AS BIGINT) as id, customer_name as name
FROM customer_table;
2. 数值格式化
将数值转换为字符串以便格式化显示。
-- 将温度值转换为字符串并添加单位
SELECT device_id, CONCAT(CAST(temperature AS VARCHAR(10)), '°C') as temp_display
FROM sensor_data
WHERE ts >= NOW() - INTERVAL 1 HOUR;
3. 字符串转数值
将字符串类型的数值数据转换为数值类型进行计算。
-- 将字符串形式的金额转换为数值进行计算
SELECT order_id,CAST(amount_str AS DOUBLE) * 1.1 as amount_with_tax
FROM orders
WHERE order_date >= '2024-01-01';
4. 精度控制
控制浮点数的精度或转换为整数。
-- 将浮点数转换为整数
SELECT device_id,CAST(avg_value AS INT) as avg_value_int
FROM (SELECT device_id, AVG(value) as avg_value FROM measurements GROUP BY device_id
) t;
5. 时间戳转换
在时间戳和字符串之间进行转换。
-- 将时间戳转换为字符串
SELECT device_id,CAST(ts AS VARCHAR(32)) as timestamp_str,value
FROM sensor_data
LIMIT 10;
6. 数据导入预处理
在数据导入过程中进行类型转换。
-- 从临时表导入数据时进行类型转换
INSERT INTO target_table (id, value, created_time)
SELECT CAST(id_str AS BIGINT),CAST(value_str AS DOUBLE),CAST(time_str AS TIMESTAMP)
FROM temp_import_table;
7. 条件查询中的类型匹配
在 WHERE 条件中统一比较字段的类型。
-- 确保比较时类型一致
SELECT * FROM device_logs
WHERE CAST(device_id AS VARCHAR(20)) = 'DEV001'AND ts >= NOW() - 10s;
类型转换规则
数值类型转换
-- 整数间转换
SELECT CAST(123 AS TINYINT); -- 结果: 123
SELECT CAST(1000 AS TINYINT); -- 可能溢出,结果取决于具体实现-- 浮点数转整数
SELECT CAST(3.14 AS INT); -- 结果: 3
SELECT CAST(3.99 AS INT); -- 结果: 3(截断小数部分)
字符串转数值
-- 有效数值字符串
SELECT CAST('123' AS INT); -- 结果: 123
SELECT CAST('3.14' AS DOUBLE); -- 结果: 3.14-- 无效字符串(不会报错)
SELECT CAST('abc' AS INT); -- 结果: 0
SELECT CAST('123abc' AS INT); -- 结果: 123(解析有效部分)
数值转字符串
-- 基本转换
SELECT CAST(123 AS VARCHAR(10)); -- 结果: '123'
SELECT CAST(3.14159 AS VARCHAR(5)); -- 结果: '3.14'(可能截断)
时间戳转换
-- 时间戳与字符串互转
SELECT CAST(NOW() AS VARCHAR(32));
SELECT CAST('2024-01-01 12:00:00' AS TIMESTAMP);
使用注意事项
1. 错误处理
-- 不支持的类型转换会直接报错
-- SELECT CAST(json_col AS INT) FROM table_name; -- 错误!
2. 数据精度丢失
-- 大数值转换可能溢出
SELECT CAST(999999999999 AS SMALLINT); -- 可能溢出-- 字符串截断
SELECT CAST('very long string' AS VARCHAR(5)); -- 结果: 'very '
3. 性能考虑
-- 避免在大数据量查询中频繁使用类型转换
-- 考虑在应用层或导入时进行类型转换
SELECT device_id, value
FROM sensor_data
WHERE device_id = 1001 -- 比下面的查询更高效
-- WHERE CAST(device_id AS VARCHAR) = '1001'
4. NULL 值处理
-- NULL 值转换结果仍为 NULL
SELECT CAST(NULL AS INT); -- 结果: NULL
SELECT CAST(NULL AS VARCHAR(10)); -- 结果: NULL
最佳实践
1. 提前进行类型转换
-- 在数据导入时就进行类型转换,避免查询时转换
CREATE TABLE sensor_data_clean AS
SELECT device_id,CAST(temperature_str AS DOUBLE) as temperature,CAST(timestamp_str AS TIMESTAMP) as ts
FROM sensor_data_raw;
2. 合理选择目标类型长度
-- 为字符串类型指定合适的长度
SELECT CAST(device_id AS VARCHAR(20)) as device_id_str -- 而不是 VARCHAR(100)
FROM devices;
3. 结合其他函数使用
-- 与字符串函数组合
SELECT CONCAT('Device-', CAST(device_id AS VARCHAR(10))) as device_name
FROM devices;-- 与数学函数组合
SELECT ROUND(CAST(value_str AS DOUBLE), 2) as rounded_value
FROM measurements;
4. 条件判断中的使用
-- 使用 CASE 表达式处理转换异常
SELECT device_id,CASE WHEN value_str REGEXP '^[0-9]+\.?[0-9]*$' THEN CAST(value_str AS DOUBLE)ELSE 0.0 END as safe_value
FROM sensor_readings;
常见问题
Q1: 为什么字符串转数值时没有报错但结果不对?
A: TDengine 的 CAST 函数采用容错机制,无效字符串转换为数值时不会报错,而是返回默认值(通常是 0)或解析有效部分。
Q2: 如何避免数值溢出?
A: 在转换前先检查数值范围,或选择更大的目标类型。
Q3: DECIMAL 类型转换有什么限制?
A: DECIMAL 类型不支持与 JSON、VARBINARY、GEOMETRY 类型的互转。
Q4: 性能优化建议?
A:
- 避免在 WHERE 条件中对索引列进行类型转换
- 考虑在数据导入时就完成类型转换
- 对于频繁查询的数据,建议创建转换后的视图或物化表
通过合理使用 CAST 函数,可以有效解决数据类型不匹配的问题,提高数据处理的灵活性和准确性。