昨天我想在Oracle表中添加一个布尔字段。但是,Oracle中实际上没有布尔数据类型。有没有人知道模拟布尔值的最佳方法?谷歌搜索主题发现了几种方法
使用整数,只是不要为它分配除0或1以外的任何东西。
使用带有'Y'或'N'的字段作为唯一的两个值。
使用带有CHECK约束的枚举。
经验丰富的Oracle开发人员是否知道哪种方法是首选/规范的?
答案 0 :(得分:82)
我发现this链接很有用。
以下是突出显示每种方法的一些优点/缺点的段落。
最常见的设计是模仿许多类似布尔的 Oracle数据字典视图使用的标志,选择'Y'表示true 和'N'表示错误。但是,要与主机正确交互 环境,例如JDBC,OCCI和其他编程环境, 最好选择0表示false,1表示true表示可以正常工作 正确使用getBoolean和setBoolean函数。
基本上,他们提倡方法2,为了效率,使用
getBoolean()
等的互操作性)并带有检查约束他们的例子:
create table tbool (bool char check (bool in (0,1)); insert into tbool values(0); insert into tbool values(1);`
答案 1 :(得分:28)
Oracle本身使用Y / N作为布尔值。为了完整性,应该注意pl / sql有一个布尔类型,只有表没有。
如果您使用该字段来指示是否需要处理记录,您可以考虑使用Y和NULL作为值。这使得索引非常小(读取速度快),占用空间非常小。
答案 2 :(得分:26)
要使用最少的空间,您应使用约束为“Y”或“N”的CHAR字段。 Oracle不支持BOOLEAN,BIT或TINYINT数据类型,因此CHAR的一个字节尽可能小。
答案 3 :(得分:19)
最佳选项是0和1(作为数字 - 另一个答案表明0和1为空间效率的 CHAR 但对我来说有点太扭曲了),使用NOT NULL和检查约束将内容限制为这些值。 (如果您需要列可以为空,那么它不是您正在处理的布尔值,而是具有三个值的枚举...)
0/1的优点:
select sum(is_ripe) from bananas
而不是select count(*) from bananas where is_ripe = 'Y'
或甚至(yuk)select sum(case is_ripe when 'Y' then 1 else 0) from bananas
'Y'/'N'的优点:
另一张海报建议'Y'/ null表示性能提升。如果你证明你需要表现,那么公平,但另外避免,因为它使查询不那么自然(some_column is null
而不是some_column = 0
)和左连接你会将虚假与不存在的记录混为一谈。
答案 4 :(得分:5)
带有检查约束的1/0或Y / N.以太方式很好。我个人更喜欢1/0,因为我在perl中做了很多工作,这使得在数据库字段上进行perl布尔运算变得非常容易。
如果你想与Oracles的一位主持人真诚地深入讨论这个问题,请查看Tom Kyte对此问题的评论Here
答案 5 :(得分:4)
数据库我完成了大部分工作,使用'Y'/'N'作为布尔值。通过该实现,您可以实现一些技巧:
计算为真的行:
SELECT SUM(BOOLEAN_FLAG ='Y',然后1个0)来自X
对行进行分组时,强制执行“如果一行为真,则全部为真”逻辑:
来自Y的SELECT MAX(BOOLEAN_FLAG)
相反,如果一行为假,则使用MIN强制分组为假。
答案 6 :(得分:2)
通过向oracle数据库中的现有表添加“布尔”列来实现接受的答案的工作示例(使用number
类型):
ALTER TABLE my_table_name ADD (
my_new_boolean_column number(1) DEFAULT 0 NOT NULL
CONSTRAINT my_new_boolean_column CHECK (my_new_boolean_column in (1,0))
);
这将在my_table_name
中创建一个名为my_new_boolean_column
的新列,默认值为0.该列不接受NULL
值,并将接受的值限制为0
或1
。
答案 7 :(得分:1)
在我们的数据库中,我们使用枚举来确保我们将其传递给TRUE或FALSE。如果你使用前两种方法中的任何一种,那么很容易开始在没有经过适当设计的情况下为整数添加新的含义,或者最终得到具有Y,y,N,n,T,t的char字段, F,f值并且必须记住哪个代码段使用哪个表以及它使用的是哪个版本。