【问题标题】:Casting smallint to boolean in PostgreSQL在 PostgreSQL 中将 smallint 转换为布尔值
【发布时间】:2015-09-29 09:10:34
【问题描述】:

我正在尝试将 smallint 转换为 PostgreSQL 中的布尔值。这不是开箱即用的,例如:

select (1::smallint)::bool;

返回“错误:42846:无法将类型 smallint 转换为布尔值”

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

select (1::smallint)::int::bool;

但我想知道是否有一种方法可以定义如何将smallint 直接转换为boolean

原因是我(以及与我一起工作的其他人)有汇总查询,将数据库表中的int 列转换为boolean。我想将此列更改为smallint,但这样做会破坏这种逻辑,因为没有从smallint 直接转换为boolean。是否可以使用 postgres CREATE CAST 来定义如何将 smallint 转换为 boolean

【问题讨论】:

    标签: postgresql casting


    【解决方案1】:
    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;
    

    【讨论】:

    • PostgreSQL 本身不支持这种转换的原因是什么?
    • @usta 因为你必须在创建表时创建布尔类型的列,而不是在它之后
    • @Acuna 我不明白你的意思。这里没有涉及任何列或表,只有一个 smallint 类型的值,我们想将其强制转换为 boolean。似乎是开箱即用支持的非常简单的东西。
    • @usta 但 Postgres 有特殊的 boolean 类型来存储 bool,为什么需要将 int 转换为 bool? Int 代表 int,bool 代表 bool,不是吗?)
    • @Acuna 和 text 用于文本,numeric 用于数字,但在很多情况下需要将一种类型转换为另一种类型。如果一切都有其正确的类型,为什么还要强制转换?这是几年前的事了,所以我不记得出现这种确切需求的确切情况,但确实如此,我必须解决,我假设的 OP 也是如此。
    【解决方案2】:

    我在尝试:

    ALTER TABLE mytable ALTER COLUMN mycol TYPE bool USING mycol::bool;
    

    使用与“Ispirer SQLWays Migrations”的答案相同的方法(将 smallint 转换为 int,然后转换为 boolean)工作:

    ALTER TABLE mytable ALTER COLUMN mycol TYPE bool USING mycol::int::bool;
    

    【讨论】:

      猜你喜欢
      • 2015-03-26
      • 1970-01-01
      • 2020-12-10
      • 2016-04-27
      • 2012-02-25
      • 2015-02-20
      • 1970-01-01
      • 2014-12-23
      • 2011-04-17
      相关资源
      最近更新 更多