⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
类型转换

类型转换是指将特定数据类型的值转换为另一种数据类型中对应值的操作。类型转换可以是隐式的,也可以是显式的。此处描述的语法执行的是显式类型转换。更多关于类型转换的信息可以在类型转换页面找到。

显式类型转换

显式类型转换的标准 SQL 语法是 CAST(expr AS TYPENAME),其中 TYPENAMEDuckDB 数据类型的名称(或别名)。DuckDB 也支持简写语法 expr::TYPENAME,该语法在 PostgreSQL 中也存在。

SELECT CAST(i AS VARCHAR) AS i
FROM generate_series(1, 3) tbl(i);
i
1
2
3
SELECT i::DOUBLE AS i
FROM generate_series(1, 3) tbl(i);
i
1.0
2.0
3.0

类型转换规则

并非所有类型转换都是可能的。例如,无法将 INTEGER 转换为 DATE。当类型转换无法成功执行时,也可能会抛出错误。例如,尝试将字符串 'hello' 转换为 INTEGER 将导致抛出错误。

SELECT CAST('hello' AS INTEGER);
Conversion Error:
Could not convert string 'hello' to INT32

类型转换的具体行为取决于源类型和目标类型。例如,当从 VARCHAR 转换为任何其他类型时,系统会尝试转换该字符串。

TRY_CAST

TRY_CAST 可用于在类型转换失败时,不抛出错误,而是返回 NULL 值的情况。TRY_CAST 永远不会抛出错误,如果无法进行类型转换,它将返回 NULL

SELECT TRY_CAST('hello' AS INTEGER) AS i;
i
NULL

cast_to_type 函数

cast_to_type 函数允许将表达式转换为另一列的类型。例如

SELECT cast_to_type('42', NULL::INTEGER) AS result;
┌───────┐
│  res  │
│ int32 │
├───────┤
│  42   │
└───────┘

此函数主要在中很有用,因为它允许您保持类型。这有助于创建可操作不同类型的通用宏。例如,如果输入是 INTEGER,以下宏会向数字添加值

CREATE TABLE tbl(i INT, s VARCHAR);
INSERT INTO tbl VALUES (42, 'hello world');

CREATE MACRO conditional_add(col, nr) AS
    CASE
        WHEN typeof(col) == 'INTEGER' THEN cast_to_type(col::INTEGER + nr, col)
        ELSE col
    END;
SELECT conditional_add(COLUMNS(*), 100) FROM tbl;
┌───────┬─────────────┐
│   i   │      s      │
│ int32 │   varchar   │
├───────┼─────────────┤
│  142  │ hello world │
└───────┴─────────────┘

请注意,CASE 语句需要在所有代码路径中返回相同的类型。我们可以通过添加将输入列转换为所需类型的转换,对任何输入列执行加法操作——但我们需要将加法结果再次转换回源类型,以使绑定生效。