Example 10-3. 绝对值和取反操作符类型分析
PostgreSQL 操作符表里面有几条记录用于前缀操作符 @,所有这些都是为各种数值类型实现绝对值操作的。其中有一条用于类型 float8,它是数值表中的优选类型。因此,在面对非数值输入的时候,PostgreSQL 会使用该类型∶
select @ text '-4.5' as "abs";
abs
-----
4.5
(1 row)在这里系统在应用选定的操作符之前执行类一次text到float8的转换。我们可以验证它是float8而不是其它什么类型:
select @ text '-4.5e500' as "abs";
ERROR: Input '-4.5e500' is out of range for float8
另一方面,前缀操作符 ~ (按位取反) 只为整数数据类型定义,而不是为float8定义的。因此,如果我们用 ~ 做类似实验,就有:
SELECT ~ '20' AS "negation";
ERROR: operator is not unique: ~ "unknown"
HINT: Could not choose a best candidate operator. You may need to add explicit
type casts.这是因为系统无法决定好几个可能的 ~ 操作符中应该用哪个。我们可以用明确地类型转换来帮它:
SELECT ~ CAST('20' AS int8) AS "negation";
negation
----------
-21
(1 row)