类型转换
类型转换是指将某一数据类型中的值转换为另一种数据类型中的对应值。 类型转换既可以隐式发生,也可以显式进行。这里介绍的语法用于显式转换。关于类型转换的更多信息,请参阅类型转换页面。
显式类型转换
显式类型转换的标准 SQL 语法是 CAST(expr AS TYPENAME),其中 TYPENAME 是 Goose 数据类型中的类型名称(或别名)。Goose 也支持简写语法 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
当期望的行为不是抛出错误,而是返回 NULL 时,可以使用 TRY_CAST。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 │
└───────┘
该函数主要用于 macros,因为它可以帮助你保持类型一致。
这有助于构建可作用于不同类型的通用宏。例如,下面的宏会在输入为 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 语句在所有代码路径上都需要返回相同的类型。我们可以先把任意输入列转换到目标类型来执行加法,但为了让绑定生效,还需要将加法结果再转换回源类型。