postgresql 9.3中是否有任何技术可以让它开始返回1和0而不是“0”;";及;f";对于布尔类型
实际上,我正在将ms sql server迁移到postgresql 9.3中,我们使用int数据类型存储布尔值的1和0,但在postgresql 9.3中这是不可能的。当我对postgresql的数据类型做了一些研究时,我得到了什么: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')
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
那么我想要的是什么
有人能帮帮我吗?这是紧急情况!谢谢如果列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