在postgresql 9.3中是否有任何技术要做,以便它开始返回1和0而不是" t"和" f"对于布尔类型

时间:2014-07-04 11:31:07

标签: postgresql postgresql-9.3

实际上我正在将我的ms sql server迁移到postgresql 9.3中,我们使用int数据类型来存储1和0的布尔值,但是在postgresql9.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那么我得到的问题是,我无法比较任何布尔字段,如果我使用整数然后我不能插入任何布尔值eventHough我可以比较booelan字段。并且

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

  1. 有没有办法比较smallint和boolean?
  2. 或者有没有办法在整数类型数据类型中插入布尔值。
  3. 或者我们可以做一些事情,以便布尔类型开始返回1表示true,0表示false。
  4. 有人可以帮帮我吗?这是紧急情况!感谢

2 个答案:

答案 0 :(得分:4)

默认情况下,没有此类转化 - 默认情况下,隐式转化仅用于来自类似群组的数据类型(例如integerbigint)。

幸运的是,如果你真的需要,你可以随时添加新的隐式演员。

首先,我们将创建一个新功能,将smallint转换为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 documentation警告每个人,当你不明智地使用隐式投射时会发生不好的事情:

  

保守地将标记视为隐含是明智的。一个   过多的隐式转换路径会导致PostgreSQL选择   令人惊讶的命令解释,或无法解决   命令,因为有多种可能的解释。一个   好的经验法则是使一个演员只能隐式调用   信息保持相同类型之间的转换   一般类型。

您可以从表pg_cast pg_catalog获取指定类型的演员表:

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

答案 1 :(得分:2)

如果布尔类型的列if然后将其转换为整数以与整数进行比较:

select the_boolean_column::int = 1;

插入一个布尔值,因为smallint将其强制转换为整数fisrt

insert into t (integer_column) values (boolean_value::int::smallint)

使boolean_column始终返回整数创建视图

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

查询布尔列时,它不会返回't''f'。它返回一个布尔值,true或false或null。值的字符串表示形式取决于客户端,因此是't'