在PostgreSQL中将smallint转换为布尔

在PostgreSQL中将smallint转换为布尔,postgresql,casting,Postgresql,Casting,我试图在PostgreSQL中将smallint转换为布尔值。这不是现成的,例如: select (1::smallint)::bool; 返回“错误:42846:无法将类型smallint转换为布尔” 我可以使用以下方法解决此问题: select (1::smallint)::int::bool; 但我想知道是否有一种方法可以定义如何将smallint直接转换为boolean CREATE OR REPLACE FUNCTION boolean1(i smallint) RETURNS b

我试图在PostgreSQL中将smallint转换为布尔值。这不是现成的,例如:

select (1::smallint)::bool;
返回“错误:42846:无法将类型smallint转换为布尔”

我可以使用以下方法解决此问题:

select (1::smallint)::int::bool;
但我想知道是否有一种方法可以定义如何将
smallint
直接转换为
boolean

CREATE OR REPLACE FUNCTION boolean1(i smallint) RETURNS boolean AS $$
    BEGIN
            RETURN (i::smallint)::int::bool;
    END;
$$ LANGUAGE plpgsql;

CREATE CAST (smallint AS boolean) WITH FUNCTION boolean1(smallint) AS ASSIGNMENT;
这是因为我(以及我所使用的其他人)有一个摘要查询,它将数据库表中的
int
列转换为
boolean
。我想将此列更改为
smallint
,但这样做会中断此逻辑,因为没有将
smallint
直接转换为
boolean
。是否可以使用postgres
CREATE CAST
定义如何将
smallint
转换为
boolean

CREATE OR REPLACE FUNCTION boolean1(i smallint) RETURNS boolean AS $$
    BEGIN
            RETURN (i::smallint)::int::bool;
    END;
$$ LANGUAGE plpgsql;

CREATE CAST (smallint AS boolean) WITH FUNCTION boolean1(smallint) AS ASSIGNMENT;
ALTER TABLE mytable ALTER COLUMN mycol TYPE bool USING mycol::bool;
使用与“Ispirer SQLWays Migrations”答案相同的方法(将smallint转换为int,然后转换为boolean)有效:


PostgreSQL本机不支持此转换的原因是什么?@usta,因为创建表时必须创建布尔类型的列,而不是在创建表后it@Acuna我不知道你说的是什么意思。这里没有涉及任何列或表,只有一个类型为
smallint
的值,我们希望将其转换为
布尔值。似乎是非常简单的东西,需要开箱即用。@usta但是Postgres有特殊的
boolean
类型来存储bool,为什么需要将int转换为bool?Int代表Int,bool代表bool,不是吗?@Acuna和
text
代表文本,
numeric
代表数字,但在很多情况下,需要将一种类型转换为另一种类型。如果每样东西都有它合适的类型,为什么还要有石膏呢?这是几年前的事了,所以我不记得这个确切的需求是在什么情况下出现的,但它确实出现了,我必须解决这个问题,我假设的OP也是如此。