Oracle中的布尔字段
时间:2020-03-05 18:43:49 来源:igfitidea点击:
昨天,我想向Oracle表中添加一个布尔字段。但是,Oracle中实际上没有布尔数据类型。这里有人知道模拟布尔的最佳方法吗?谷歌搜索主题发现了几种方法
- 使用整数,不要为它分配0或者1之外的任何东西。
- 使用字符字段" Y"或者" N"作为仅有的两个值。
- 使用带有CHECK约束的枚举。
有经验的Oracle开发人员是否知道哪种方法是首选/规范的?
解决方案
回答
在我们的数据库中,我们使用一个枚举来确保将其传递为TRUE或者FALSE。如果我们采用前两种方式中的任何一种,那么很容易或者不经过适当的设计就开始向整数添加新含义,或者以具有Y,y,N,n,T,t F,f值,并且必须记住代码的哪个部分使用哪个表以及它使用的是哪个版本的true。
回答
我发现此链接很有用。
以下段落重点介绍了每种方法的一些优点/缺点。
The most commonly seen design is to imitate the many Boolean-like flags that Oracle's data dictionary views use, selecting 'Y' for true and 'N' for false. However, to interact correctly with host environments, such as JDBC, OCCI, and other programming environments, it's better to select 0 for false and 1 for true so it can work correctly with the getBoolean and setBoolean functions.
基本上,为了效率起见,他们提倡方法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);`
回答
要使用最少的空间,应使用限制为" Y"或者" N"的CHAR字段。 Oracle不支持BOOLEAN,BIT或者TINYINT数据类型,因此CHAR的一个字节尽可能小。
回答
我完成大部分工作的数据库使用" Y" /" N"作为布尔值。通过该实现,我们可以实现一些技巧,例如:
- 对正确的行进行计数:SELECT SUM(当BOOLEAN_FLAG ='Y'然后为1,否则为0时)为X
- 当对行进行分组时,强制执行"如果一行为真,则所有为真"逻辑:SELECT MAX(BOOLEAN_FLAG)FROM Y相反,如果一行为假,则使用MIN强制分组为false。
回答
具有检查约束的1/0或者Y / N。以太的方式很好。我个人更喜欢1/0,因为我在perl中做了很多工作,这使得在数据库字段上执行perl布尔运算非常容易。
如果我们想与一位甲骨文公司负责人深入讨论此问题,请查看汤姆·凯特(Tom Kyte)关于此的评论
回答
Oracle本身对布尔值使用Y / N。为了完整性,应注意pl / sql具有布尔类型,只有表没有。
如果使用该字段指示是否需要处理记录,则可以考虑使用Y和NULL作为值。这使得占用空间很小的索引非常小(快速读取)。