有没有办法转换postgresql 9.3数据类型,以便它只能影响一方

时间:2014-07-08 05:02:13

标签: postgresql types casting postgresql-9.3

我正在使用ppas9.3(oracle兼容),我想进行转换,以便它只影响一侧。 我想要的是,我想要一个数据类型,它可以在插入和比较期间接受整数和布尔值,但没有取得任何成功,正在发生的主要问题是: 最初他们接受这些价值观:

In Postgresql:-
For Integer type datatype:-

insert into ask(aint) values(1,'1')         working
insert into ask(aint) values(true)      not working
select * from ask where aint=1,'1',true;    working


*For smallint type datatype:-

insert into ask(asmall) values(1,'1',true); working
select * from ask where asmall = 1,'1'      working
select * from ask where asmall = true   not working

For boolean type datatype:-

insert into ask(abool) values(1)        not working
insert into ask(abool) values(true)     working
select * from ask where abool=1,true    working

进行内部投射后,意味着更新'整数'在比较时接受' true'(布尔)'整数'专栏完全恢复并开始工作与' smallint'对于' smallint'对于'布尔'也是如此。

所以我的问题是"Is there any internal casting is available in postgresql 9.3 so that it can affect only one side means either at the time of 'insertion' or at the time of 'comparison'"。所以,如果您有任何此类技术,请分享。谢谢。

2 个答案:

答案 0 :(得分:3)

如相关答案所述:
Generate series of dates - using date type as input
有三种类型的演员。您的来源和目标类型的注册演员必须是“分配”(a)或“隐式”(i)才能在VALUES INSERT表达式中使用言。

正如您在system catalog pg_cast中看到的那样,从booleaninteger的演员表仅定义为“显式”(e):

SELECT castsource::regtype, casttarget::regtype, castfunc::regproc, castcontext
FROM   pg_cast
WHERE  castsource = 'bool'::regtype
AND    casttarget = 'int'::regtype;

结果:

castsource  casttarget  castfunc         castcontext
boolean     integer     pg_catalog.int4  e

您必须更改castcontext才能使其正常工作 - 您可以以超级用户身份执行此操作。这种异域策略没有“ALTER CAST”声明,所以你必须直接UPDATE

UPDATE pg_cast
SET    castcontext = 'a'
WHERE  castsource = 'bool'::regtype
AND    casttarget = 'int'::regtype;

但是,每个演员阵容的预定义演员上下文都有充分的理由。篡改系统目录不是你应该轻易做的事情。在这种特殊情况下,当Postgres必须选择匹配的演员时,它可能会使决策失衡。喜欢从一组重载函数中挑选......

integer -> booleanint2 -> booleanboolean -> int2等的类似程序

答案 1 :(得分:1)

不确定,但为什么你不能像下面那样直接使用CAST运算符,这样可以正常工作。

insert into ask(aint) values( cast(true as int));

示例演示请参阅HERE

create table ask(aint int);

insert into ask(aint) values(1);

insert into ask(aint) values( cast(true as int));

选择将导致:1,1

select * from ask