当前位置: 首页 > 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.dtcms.com/a/295899.html

相关文章:

  • SpringBoot复习
  • Flink-1.19.0源码详解8-ExecutionGraph生成-前篇
  • 洛谷刷题7.24
  • CellFlow:Flow matching建模cell状态变化
  • 如何将拥有的域名自定义链接到我的世界服务器(Minecraft服务器)
  • 大数据集分页优化:LIMIT OFFSET的替代方案
  • Oracle国产化替代:一线DBA的技术决策突围战
  • 如何判断钱包的合约签名是否安全?
  • MySQL深度理解-MySQL索引优化
  • 数据库第一章练习题(大雪圣期末参考复习)
  • 【数据结构】二叉树进阶算法题
  • MinIO 版本管理实践指南(附完整 Go 示例)
  • 一次粗心导致的bug定位
  • 《C++ string 完全指南:string的模拟实现》
  • rust-枚举
  • 开源链动2+1模式AI智能名片S2B2C商城小程序的场景体验分析
  • HBase + PostgreSQL + ElasticSearch 联合查询方案
  • vue3 el-table 列数据合计
  • MongoDB 副本集搭建与 Monstache 实时同步 Elasticsearch 全流程教程
  • AI开放课堂:钉钉MCP开发实战
  • 【DBeaver 安装 MongoDB 插件】
  • 推荐系统如何开发
  • Python —— 真题九
  • web:js函数的prototype(原型对象)属性
  • RabbitMQ简述
  • 前端笔记:同源策略、跨域问题
  • 重绘(Repaint)与重排(Reflow)
  • 【ECharts✨】解决Vue 中 v-show 导致组件 ECharts 样式异常问题
  • 简单Proxy使用
  • 【Newman+Jenkins】实施接口自动化测试