当前位置: 首页 > news >正文

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 的所有数据类型,包括:

  • 数值类型:TINYINTSMALLINTINTBIGINTFLOATDOUBLEDECIMAL
  • 字符串类型:VARCHAR(n)NCHAR(n)BINARY(n)
  • 时间类型:TIMESTAMP
  • 布尔类型:BOOL
  • 几何类型:GEOMETRY
  • 二进制类型:VARBINARY(n)

特殊限制

  • type_nameVARBINARY 时,expr 只能是 VARCHAR 类型
  • DECIMAL 类型不支持与 JSONVARBINARYGEOMETRY 类型的互转

适用范围

  • 表类型:支持普通表和超级表
  • 嵌套查询:支持内层查询和外层查询
  • 版本要求: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 函数,可以有效解决数据类型不匹配的问题,提高数据处理的灵活性和准确性。

http://www.lryc.cn/news/598635.html

相关文章:

  • Windows 11下纯软件模拟虚拟机的设备模拟与虚拟化(仅终端和网络)
  • C++性能优化实战‘从毫秒到微秒的底层突围‘
  • Windows 10 停服:个人与企业的 “系统选择题”
  • MNIST 手写数字识别模型分析
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——4. 前后端联动:打通QML与C++的任督二脉
  • LAYOUT 什么时候需要等长布线?
  • 【牛客刷题】和零在一起
  • 【Linux】Linux了解与基本指令(1)
  • 数据库期中复习
  • SkyWalking异步采集spring gateway日志
  • postgresql执行创建和删除时遇到的问题
  • AWS云S3+Glue+EMRonEC2+ReadShift
  • ThinkPHP8集成RabbitMQ的完整案例实现
  • 使用 Strands Agents 开发并部署生产级架构通用型个人助手
  • 【论文阅读】基于EEG的冥想状态数据挖掘研究(2025)
  • 深入探索Amazon SQS:构建弹性微服务与无服务器应用的秘密武器
  • Nodejs:从“模块未找到”到“大师之路”, 项目初始化与依赖安全完全指南
  • JimuReport 积木报表 v2.1.1 版本发布,免费开源的报表和大屏
  • 主流摄像头协议及其开源情况,GB/T 28181协议介绍
  • Word2Vec模型训练全流程解析:从数据预处理到实体识别应用
  • PyTorch常用Tensor形状变换函数详解
  • 如何恢复mysql,避免被研发删库跑路
  • 多模态数据处理系统:用AI读PDF的智能助手系统分析
  • 六、Element-快速入门
  • K8s WebUI 选型:国外 Rancher vs 国内 KubeSphere vs 原生 Dashboard,从部署到使用心得谁更适合企业级场景?
  • 从零用java实现 小红书 springboot vue uniapp(14) 集成阿里云短信验证码
  • Android安全存储:加密文件与SharedPreferences最佳实践
  • 【C++】使用箱线图算法剔除数据样本中的异常值
  • 进程通信----匿名管道
  • 【redis其它面试问题】