昨天,我想向Oracle表中添加一个布尔字段。但是,Oracle中实际上没有布尔数据类型。这里有人知道模拟布尔的最佳方法吗?搜寻主题时发现了几种方法
使用整数,不要为它分配0或1之外的任何东西。
使用字符字段“ Y”或“ N”作为仅有的两个值。
使用带有CHECK约束的枚举。
有经验的Oracle开发人员是否知道哪种方法是首选/规范的?
昨天,我想向Oracle表中添加一个布尔字段。但是,Oracle中实际上没有布尔数据类型。这里有人知道模拟布尔的最佳方法吗?搜寻主题时发现了几种方法
使用整数,不要为它分配0或1之外的任何东西。
使用字符字段“ Y”或“ N”作为仅有的两个值。
使用带有CHECK约束的枚举。
有经验的Oracle开发人员是否知道哪种方法是首选/规范的?
Answers:
我发现此链接很有用。
以下段落重点介绍了每种方法的一些优点/缺点。
最常见的设计是模仿Oracle数据字典视图使用的许多类似Boolean的标志,选择'Y'表示true,选择'N'表示false。但是,要与主机环境(例如JDBC,OCCI和其他编程环境)正确交互,最好为false选择0,为true选择1,以便可以与getBoolean和setBoolean函数一起正常工作。
基本上,为了效率起见,他们提倡方法2,使用
getBoolean()
等具有互操作性),并且带有检查约束他们的例子:
create table tbool (bool char check (bool in (0,1)); insert into tbool values(0); insert into tbool values(1);`
Oracle本身对布尔值使用Y / N。为了完整起见,应注意pl / sql具有布尔类型,只有表没有。
如果您使用该字段指示是否需要处理记录,则可以考虑使用Y和NULL作为值。这使得占用空间很小的索引非常小(快速读取)。
最好的选择是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
),并且在左联接中,您会将错误与不存在的记录混合在一起。
具有检查约束的1/0或Y / N。以太的方式很好。我个人更喜欢1/0,因为我在perl中做了很多工作,这使得在数据库字段上执行perl布尔运算非常容易。
如果您想与一位甲骨文公司主管进行深入的讨论,请查看汤姆·凯特(Tom Kyte)关于此的评论。
我完成大部分工作的数据库使用'Y'/'N'作为布尔值。通过该实现,您可以实现一些技巧,例如:
计算正确的行:
SELECT SUM(当BOOLEAN_FLAG ='Y'然后为1,否则为0时)为X
在对行进行分组时,强制执行“如果一行为真,则所有为真”逻辑:
SELECT MAX(BOOLEAN_FLAG)FROM Y
相反,如果一行为假,则使用MIN强制分组为false。
通过在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
。
在我们的数据库中,我们使用一个枚举来确保将其传递为TRUE或FALSE。如果您采用前两种方式中的任何一种,则很容易要么不经过适当的设计就开始向整数添加新含义,要么以具有Y,y,N,n,T,t的char字段结尾, F,f值,并且必须记住代码的哪个部分使用哪个表以及它使用的是哪个版本的true。
wall
数据类型,以便在使用布尔值时可以反对它。