postgresql 9.3中是否有任何技术可以让它开始返回1和0而不是“0”;";及;f";对于布尔类型

postgresql 9.3中是否有任何技术可以让它开始返回1和0而不是“0”;";及;f";对于布尔类型,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,实际上,我正在将ms sql server迁移到postgresql 9.3中,我们使用int数据类型存储布尔值的1和0,但在postgresql 9.3中这是不可能的。当我对postgresql的数据类型做了一些研究时,我得到了什么: In Postgresql:- For Integer type datatype:- insert into ask(aint) values(1) working insert into ask(aint) values('1')

实际上,我正在将ms sql server迁移到postgresql 9.3中,我们使用int数据类型存储布尔值的1和0,但在postgresql 9.3中这是不可能的。当我对postgresql的数据类型做了一些研究时,我得到了什么:

In Postgresql:-
For Integer type datatype:-

insert into ask(aint) values(1)         working
insert into ask(aint) values('1')       working

insert into ask(aint) values(true)      not working

select * from ask where aint=1;     working
select * from ask where aint='1';   working
select * from ask where aint=true;  working


*For smallint type datatype:-

insert into ask(asmall) values(1);      working
insert into ask(asmall) values('1');    working
insert into ask(asmall) values(true);   working

select * from ask where asmall = 1      working
select * from ask where asmall = '1'    working
select * from ask where asmall = true   not working
如果我想使用smallint,那么我遇到的问题是,我不能比较任何布尔字段,如果我使用integer,那么即使我可以比较booelan字段,我也不能插入任何布尔值。及

我不能使用布尔数据类型,因为它返回“t”表示true,返回“f”表示false 那么我想要的是什么

  • 有没有办法比较smallint和boolean
  • 或者是否有任何方法可以在整型数据类型中插入布尔值
  • 或者我们可以做些什么,使布尔类型开始返回1表示真,0表示假

  • 有人能帮帮我吗?这是紧急情况!谢谢

    如果列if为布尔类型,则将其强制转换为整数以与整数进行比较:

    select the_boolean_column::int = 1;
    
    要将布尔值作为smallint插入,请将其转换为整数first

    insert into t (integer_column) values (boolean_value::int::smallint)
    
    要使布尔值_列始终返回整数,请创建一个视图

    create view v as
    select boolean_column::int as integer_column
    from t
    

    查询布尔列时,它不会返回
    't'
    'f'
    。它返回一个布尔值,true、false或null。值的字符串表示由客户端决定,因此默认情况下,
    't'

    没有这种转换-默认情况下,隐式转换仅用于类似组的数据类型(例如
    整数
    bigint

    幸运的是,如果确实需要,您可以随时添加新的隐式强制转换

    首先,我们将创建一个新函数,将
    smallint
    转换为
    boolean
    。为此,我们将使用现有的C函数
    bool_int4

    CREATE OR REPLACE FUNCTION int2(boolean)
      RETURNS smallint AS
    'bool_int4'
      LANGUAGE internal IMMUTABLE STRICT
      COST 1;
    
    现在,我们可以创建从布尔到smallint的新隐式强制转换:

    CREATE CAST (boolean AS smallint) WITH FUNCTION int2(boolean) as implicit;
    
    最后,我们准备直接比较smallint和boolean:

    select 1::smallint=true
    
    PostgreSQL警告所有人,如果不明智地使用隐式转换,可能会发生不好的事情:

    明智的做法是保守地将强制转换标记为隐式。一 过多的隐式转换路径会导致PostgreSQL选择 令人惊讶的命令解释,或无法解决 命令,因为有多种可能的解释。A. 好的经验法则是使强制转换仅对 同一数据库中类型之间的信息保持转换 一般类型类别

    您可以从表中的
    pg_catalog
    获取指定类型的强制转换列表:

    这将返回(9.1.9):


    您好,谢谢您的快速回复,我现在编辑了,实际上我的问题是,在执行查询后,我希望1表示true,0表示false,而不是“t”和“f”。但是:您为什么要这样做?您试图解决的真正问题是什么?实际上,我写这篇文章是为了说明我们可以在不同的语句中使用1或“1”,无论我以何种方式编辑和编写整个查询。现在您可以看到。再次说明:您试图解决的真正问题是什么?为什么不在插入/更新时使用
    布尔值
    真值
    /
    假值
    ?事实上,我们的项目已经支持oracle和sql server,我还想再支持一个数据库,如postgresql,但是所有的代码都编写为insert 1 for true并返回相同的值,我们也在使用hibernate3,它在两个数据库中都可以工作,所以现在我希望postgresql也使用相同的值。可能吗?你看过我在帖子中写的所有3个问题了吗?谢谢Clodoaldo,但我想要内部演员。我不希望我的代码有任何改变。有没有办法得到1和0,我用的是ppas9.3thanks-Tomas,实际上我用了和你写的一样的cmd,它又返回了两个“boolean”;“smallint”;“i”“smallint”;“布尔”;“我”所以使用它们是安全的。请告诉我如何使用它们。@Krishna你到底是什么意思?默认情况下,在第9.3.1页的
    整数
    bigint
    布尔
    中只定义了四个强制转换,请参见此。如果您看到更多行,那么您可能正在使用不同的查询,或者其他人已经对db配置进行了更改。如果在创建强制转换后运行此查询,则即使
    smallint;布尔值
    可能是由其他人插入的。此修改通常应该是安全的,但不需要任何保证。我想将boolean转换为smallint,很抱歉,我使用的是与oracle兼容的ppas9.3,它将返回2个,正如我前面提到的,没有人进行任何配置,我只是安装了,没有做任何更改。那么,您能告诉我可以用来转换的确切查询吗?对不起,我想将smallint转换为boolean
    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;
    
    castsource;casttarget;castcontext;
    boolean;integer;e
    smallint;integer;i
    integer;boolean;e
    integer;smallint;a