实际上我正在将我的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 所以我想要的是什么?
有人可以帮帮我吗?这是紧急情况!感谢
答案 0 :(得分:4)
默认情况下,没有此类转化 - 默认情况下,隐式转化仅用于来自类似群组的数据类型(例如integer
和bigint
)。
幸运的是,如果你真的需要,你可以随时添加新的隐式演员。
首先,我们将创建一个新功能,将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'
。