2008-08-27 167 views
135

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

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

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

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

有经验的Oracle开发人员知道哪种方法是首选/规范?

+181

我希望Oracle拥有一个`wall`数据类型,这样在使用布尔运算符时我可以砸我的头。 – Greg 2010-03-29 20:28:51

回答

76

我发现this链接有用。

这里是强调每种方法的优点/缺点的段落。

最常见的设计是模仿Oracle的数据字典视图使用很多样布尔 标志,选择“Y”真正 和“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);` 
+31

我建议不要使用'N'和'Y',因为它依赖于语言。讲英语的人有时会忘记世界上大部分地区并不代表Y的真相概念。相比之下,0和1的含义在语言障碍中是不变的。 – 2013-09-17 08:10:04

+6

0和1作为布尔值在计算机科学中不一致 - 外壳脚本类型语言倾向于成功为0,并且非零作为失败,而C类型语言倾向于具有0作为失败,并且成功为非0 。 – Phil 2013-10-02 00:33:02

+40

作为*布尔*值,他们是不明智的。处理返回码不是布尔值。 – 2013-10-08 12:56:23

1

在我们的数据库中,我们使用一个枚举来确保将它传递给TRUE或FALSE。如果你采用前两种方法,那么就很容易开始向整数中添加新的含义而不通过适当的设计,或者结束于具有Y,y,N,n,T,t, F,f值,并且必须记住代码的哪个部分使用哪个表以及它正在使用的是哪个版本。

26

要使用的空间量最小,应使用约束为 'Y' 或 'N' 一个CHAR字段。 Oracle不支持BOOLEAN,BIT或TINYINT数据类型,所以CHAR的一个字节尽可能小。

4

我做了大部分工作的数据库使用'Y'/'N'作为布尔值。与实施,可以拉过一些小把戏,比如:

  1. 计数行是正确的:
    SELECT SUM(CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0)X

  2. 当对行进行分组,强制执行“如果一行为真,则全部为真”逻辑:
    SELECT MAX(BOOLEAN_FLAG)FROM Y
    相反,如果一行为假,则使用MIN强制分组为false。

+4

事实上,所示的例子对于0/1方法也很有用 - 而且,恕我直言,更快。 – igorsantos07 2012-01-19 20:11:37

5

1/0或Y/N带有检查约束条件。以太方式很好。我个人更喜欢1/0,因为我在perl中做了很多工作,并且它使得对数据库字段执行perl布尔操作变得非常简单。

如果你想与甲骨文头大佬之一这个问题的真正深入的讨论,查了一下汤姆凯特有说这个Here

28

甲骨文本身使用Y/N为布尔值。为了完整起见,应该注意的是,pl/sql有一个布尔类型,只有表没有。

如果您使用该字段来指示是否需要处理记录,则可以考虑使用Y和NULL作为值。这使得占用非常小的空间的非常小的(快速读取)索引。

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'甚至(议员)“Y” /“N”的select sum(case is_ripe when 'Y' then 1 else 0) from bananas

优点:

  • 占据了超过0/1
  • 这就是甲骨文表明更小的空间,所以可能有些人更习惯

另一张海报表示'Y'/ null表示性能提升。如果你已经证明,你需要的性能,那么足够公平,但否则避免,因为它使查询不那么自然(some_column is null而不是some_column = 0),并在一个左加入你会混淆虚假与不存在的记录。

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