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

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.xdnf.cn/news/16314.html

相关文章:

  • 7.24 C/C++蓝桥杯 | 排序算法
  • Android15或AndroidU广播的发送流程
  • 星慈光编程虫2号小车讲解第三篇--附件概述
  • 深入理解 IO 多路复用:从 select 到 epoll
  • MySQL---索引、事务
  • VUE2 学习笔记5 动态绑定class、条件渲染、列表过滤与排序
  • 【全新上线】境内 Docker 镜像状态监控
  • 秋招Day18 - MyBatis - 基础
  • C语言转义字符‘\\‘‘ 解析与常见误区
  • 六种经典智能优化算法(PSO/GWO/WOA/HHO/DBO/SSA)无人机(UAV)三维路径规划,Matlab代码实现
  • TimeXer - 重新审视时序预测内的外生变量
  • 【LeetCode数据结构】二叉树的应用(一)——单值二叉树问题、相同的树问题、对称二叉树问题、另一棵树的子树问题详解
  • MySQL的命令行客户端
  • markdown学习笔记(个人向) Part.2
  • 跨境支付入门~国际支付结算(区块链篇)
  • C语言:20250724笔记(函数-指针)
  • JAVA_THIRTEEN_常用API
  • 【分布式锁】什么是分布式锁?分布式锁的作用?
  • tensorflow搭建神经网络
  • Linux 磁盘挂载,查看uuid
  • 前端笔记:同源策略、跨域问题
  • 专题:2025微短剧行业生态构建与跨界融合研究报告|附100+份报告PDF汇总下载
  • Python实现PDF按页分割:灵活拆分文档的技术指南
  • 大模型提示词漏洞攻防测试:技术分析与实践指南
  • vlm MiniCPM 学习部署实战
  • 模型的存储、加载和部署
  • RCLAMP0512TQTCT 升特半导体 TVS二极管 12通道全防护芯片 以太网/PLC控制/5G基站专用
  • 微信通话自动录音器
  • 复矩阵与共轭转置矩阵乘积及其平方根矩阵
  • 基于xxl-job的分片实现分库分表后的扫表