-- 创建测试表
CREATE TABLE IF NOT EXISTS mixed_data (
id INT,
str_val STRING,
num_val DOUBLE,
date_val STRING
);
-- 插入测试数据
INSERT INTO mixed_data VALUES
(1, '100', 3.14, '2024-06-01'),
(2, '200', 2.71, '2024/06/02'),
(3, 'abc', 1.41, 'invalid_date'),
(4, '300', NULL, '2024-06-04');
基础类型转换
使用
CAST
CAST
或
::
::
进行显式类型转换。两者功能等价,
::
::
语法更简洁。
-- 将字符串转换为整数
SELECT
id,
str_val,
CAST(str_val AS INT) as cast_int,
str_val::INT as shorthand_int
FROM mixed_data
WHERE str_val NOT IN ('abc');
结果说明:
id
str_val
cast_int
shorthand_int
1
100
100
100
2
200
200
200
4
300
300
300
⚠️ 注意:如果转换失败(如
'abc'
'abc'
转
INT
INT
),
CAST
CAST
会直接报错中断查询。
安全类型转换
当数据中可能包含无法转换的值时,使用
TRY_CAST
TRY_CAST
可以避免查询报错,转换失败时返回特殊值
nan
nan
。
-- 安全转换:无法转换时返回 nan
SELECT
id,
str_val,
TRY_CAST(str_val AS INT) as safe_int
FROM mixed_data;
结果说明:
id
str_val
safe_int
1
100
100
2
200
200
3
abc
NULL
4
300
300
处理 TRY_CAST 结果
TRY_CAST
TRY_CAST
转换失败时返回
NULL
NULL
,可以直接使用
IS NULL
IS NULL
过滤:
-- 过滤转换失败的行
SELECT
id,
str_val,
TRY_CAST(str_val AS INT) as safe_int
FROM mixed_data
WHERE TRY_CAST(str_val AS INT) IS NOT NULL;
结果说明:
id
str_val
safe_int
1
100
100
2
200
200
4
300
300
日期时间转换
将字符串转换为日期或时间戳类型,支持标准格式和自定义格式。
-- 标准格式自动转换
SELECT
id,
date_val,
CAST(date_val AS DATE) as std_date
FROM mixed_data
WHERE date_val LIKE '____-__-__';
结果说明:
id
date_val
std_date
1
2024-06-01
2024-06-01
4
2024-06-04
2024-06-04
⚠️ 注意:
CAST
CAST
对日期字符串格式要求较严格(推荐
yyyy-MM-dd
yyyy-MM-dd
)。非标准格式(如
2024/06/02
2024/06/02
)会返回
NULL
NULL
,需使用
TO_DATE
TO_DATE
。
自定义格式转换
对于非标准格式,使用
TO_DATE
TO_DATE
指定格式模板:
-- 使用 TO_DATE 解析自定义格式
SELECT
id,
date_val,
TO_DATE(date_val, 'yyyy/MM/dd') as custom_date
FROM mixed_data
WHERE date_val = '2024/06/02';
JSON 数据转换
将 JSON 字符串解析为 Lakehouse 原生的
JSON
JSON
类型,以便使用 JSON 函数进行查询。
-- 解析 JSON 字符串
SELECT
id,
PARSE_JSON('{"name": "Alice", "age": 30}') as json_data,
json_extract_string(PARSE_JSON('{"name": "Alice", "age": 30}'), '$.name') as name
FROM mixed_data
WHERE id = 1;
结果说明:
id
json_data
name
1
{"name":"Alice","age":30}
Alice
💡 提示:Lakehouse 中
JSON
JSON
是一等公民类型,建议在建表时直接使用
JSON
JSON
列存储半结构化数据,性能优于
STRING
STRING
。
隐式转换规则
Lakehouse 在某些场景下会自动进行隐式转换,但建议显式转换以提高代码可读性和稳定性。
支持的隐式转换
数值类型之间:
INT
INT
→
DOUBLE
DOUBLE
(精度扩大)
字符串与日期:在
WHERE
WHERE
条件中,
date_col = '2024-06-01'
date_col = '2024-06-01'
会自动转换
不支持的隐式转换
写入操作:
INSERT INTO
INSERT INTO
时,字符串不能隐式转为
DATE
DATE
、
TIMESTAMP
TIMESTAMP
、
JSON
JSON
、
BINARY
BINARY
,必须使用显式转换。
复杂类型:
STRING
STRING
不能隐式转为
JSON
JSON
或
ARRAY
ARRAY
。
-- ❌ 错误:写入时隐式转换
INSERT INTO target_table (date_col) VALUES ('2024-06-01');
-- ✅ 正确:显式转换
INSERT INTO target_table (date_col) VALUES (DATE '2024-06-01');
-- 或使用 CAST
INSERT INTO target_table (date_col) VALUES (CAST('2024-06-01' AS DATE));