Oracle中的布尔字段

时间:2008-08-27 13:16:59

标签: oracle boolean sqldatatypes

昨天我想在Oracle表中添加一个布尔字段。但是,Oracle中实际上没有布尔数据类型。有没有人知道模拟布尔值的最佳方法?谷歌搜索主题发现了几种方法

  1. 使用整数,只是不要为它分配除0或1以外的任何东西。

  2. 使用带有'Y'或'N'的字段作为唯一的两个值。

  3. 使用带有CHECK约束的枚举。

  4. 经验丰富的Oracle开发人员是否知道哪种方法是首选/规范的?

8 个答案:

答案 0 :(得分:82)

我发现this链接很有用。

以下是突出显示每种方法的一些优点/缺点的段落。

  

最常见的设计是模仿许多类似布尔的   Oracle数据字典视图使用的标志,选择'Y'表示true   和'N'表示错误。但是,要与主机正确交互   环境,例如JDBC,OCCI和其他编程环境,   最好选择0表示false,1表示true表示可以正常工作   正确使用getBoolean和setBoolean函数。

基本上,他们提倡方法2,为了效率,使用

  • 0/1(因为与JDBC getBoolean()等的互操作性)并带有检查约束
  • CHAR的类型(因为它占用的空间比NUMBER少)。

他们的例子:

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的优点:

  • 语言无关。如果每个人都使用它,'Y'和'N'会好的。但他们没有。在法国他们使用'O'和'N'(我亲眼看过这个)。我没有在芬兰编程看他们是否使用'E'和'K' - 毫无疑问他们比那更聪明,但你不能确定。
  • 与广泛使用的编程语言(C,C ++,Perl,Javascript)的实践一致
  • 使用应用程序层进行更好的播放,例如冬眠
  • 导致更简洁的SQL,例如,找出准备吃多少香蕉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'的优点:

  • 占用的空间少于0/1
  • 这是Oracle建议的,所以可能是某些人更习惯的东西

另一张海报建议'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'作为布尔值。通过该实现,您可以实现一些技巧:

  1. 计算为真的行:
    SELECT SUM(BOOLEAN_FLAG ='Y',然后1个0)来自X

  2. 对行进行分组时,强制执行“如果一行为真,则全部为真”逻辑:
    来自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值,并将接受的值限制为01

答案 7 :(得分:1)

在我们的数据库中,我们使用枚举来确保我们将其传递给TRUE或FALSE。如果你使用前两种方法中的任何一种,那么很容易开始在没有经过适当设计的情况下为整数添加新的含义,或者最终得到具有Y,y,N,n,T,t的char字段, F,f值并且必须记住哪个代码段使用哪个表以及它使用的是哪个版本。