Skip to content

类型转换

类型转换将一种特定的数据类型中的值转换为另一种数据类型。类型转换分为显示转换和隐式转换。

显式类型转换

显式类型转换由 CAST 表达式来执行,在 Postgres 中还可以使用 col::VARCHAR 这样的语句来实现显式类型转换。

CAST

SQL
CAST (expr as typename)

SELECT CAST(i AS VARCHAR) AS i FROM generate_series(1, 3) tbl(i);

隐式类型转换

在很多情况下,执行器会自动添加类型转换,大多数都出现在与函数类型不匹配但是可以转为所需类型的参数调用的情况。例如 sin(DOUBLE) 该函数接受 DOUBLE 类型的列作为输入参数,但是如何传入整数 sin(1) 他同样能够执行。

类型转换矩阵

并不是所有类型都能转换为任意类型,唯一的例外就是 NULL 他代表所有类型的空值。以下展示了允许进行隐式转换和显式转换的类型:

typecasting

在类型转换中还需要注意几个要点:

  1. 允许导致精度损失的 CAST 操作,通常出现在在浮点数到整数类型的显式转换,他们将被四舍五入
SQL
SELECT CAST(3.5 AS INTEGER);
  1. 溢出会引发异常
SQL
-- ERROR
SELECT CAST(999 AS TINYINT);
  1. VARCHAR 类型是通用类型,任何其他类型的值始终可以转换为 VARCHAR 类型,理论上转换为 VARCHAR 是一种无损操作,任何类型在转换为文本后都可以转换为原始类型
SQL
SELECT CAST(42.5 AS VARCHAR);

转化技巧

整个转换最大的问题就是如果出现无法转换的情况的错误处理,这种情况下可以通过一些技巧来避免错误。

巧用 NULLIF 来将无法转换的值转换为 NULL

前面说到 NULL 是比较特殊的存在,他和任何数据类型兼容。一个很常见的就是我们想要将字符串转换为数字的情况,如果出现了空字符串我们希望转换为 NULL,但是默认的 '':int 会报错,此时我们就可以通过 NULLIF 函数来避免:

SQL
SELECT ''::INT;
Conversion Error: Could not convert string '' to INT32
LINE 1: SELECT ''::INT;
                 ^

SELECT NULLIF('', '')::INT:

Tips

NULLIF 是 PostgreSQL 中一个非常有用的函数,用于比较两个表达式。如果两个表达式相等,则返回 NULL;否则返回第一个表达式的值。

参考