默认情况下,没有这样的转换 - 隐式转换默认仅用于来自相似组的数据类型(例如integer
and bigint
).
幸运的是,如果确实需要,您始终可以添加新的隐式转换。
首先,我们将创建一个新函数来转换smallint
to boolean
。为此,我们将使用现有的 C 函数bool_int4
.
CREATE OR REPLACE FUNCTION int2(boolean)
RETURNS smallint AS
'bool_int4'
LANGUAGE internal IMMUTABLE STRICT
COST 1;
现在我们可以创建从 boolean 到smallint 的新隐式转换:
CREATE CAST (boolean AS smallint) WITH FUNCTION int2(boolean) as implicit;
最后,我们准备直接比较smallint和boolean:
select 1::smallint=true
PostgreSQL文档警告大家,如果不明智地使用隐式转换,可能会发生不好的事情:
将强制转换标记为隐式时保持保守是明智的。一个
过多的隐式转换路径会导致 PostgreSQL 选择
对命令的令人惊讶的解释,或者无法解决
命令根本没有,因为有多种可能的解释。 A
好的经验法则是使强制转换只能隐式调用
同一类型中类型之间的信息保留转换
一般类型类别。
您可以从以下位置获取指定类型的强制转换列表pg_catalog
,从表pg_cast:
select
castsource::regtype,
casttarget::regtype,
castcontext
from
pg_catalog.pg_cast
where
castsource::regtype in ('boolean','smallint','integer') and
casttarget::regtype in ('boolean','smallint','integer')
order by
castsource::regtype,
casttarget::regtype;
这将返回(9.1.9):
castsource;casttarget;castcontext;
boolean;integer;e
smallint;integer;i
integer;boolean;e
integer;smallint;a