Eli*_*ght 145 oracle boolean sqldatatypes
昨天我想在Oracle表中添加一个布尔字段.但是,Oracle中实际上没有布尔数据类型.有没有人知道模拟布尔值的最佳方法?谷歌搜索主题发现了几种方法
使用整数,只是不要为它分配除0或1以外的任何东西.
使用带有"Y"或"N"的char字段作为唯一的两个值.
使用带有CHECK约束的枚举.
有经验的Oracle开发人员是否知道哪种方法是首选/规范的?
Col*_*ger 82
我发现此链接很有用.
以下是突出显示每种方法的一些优点/缺点的段落.
最常见的设计是模仿Oracle数据字典视图使用的许多类似布尔的标志,选择'Y'表示true,选择'N'表示false.但是,要与主机环境(如JDBC,OCCI和其他编程环境)正确交互,最好选择0表示false,1表示true表示它可以正常使用getBoolean和setBoolean函数.
基本上他们提倡方法2,为了效率,使用
getBoolean()等)和检查约束他们的例子:
Run Code Online (Sandbox Code Playgroud)create table tbool (bool char check (bool in (0,1)); insert into tbool values(0); insert into tbool values(1);`
Lei*_*fel 28
Oracle本身使用Y/N作为布尔值.为了完整性,应该注意pl/sql有一个布尔类型,只有表没有.
如果您使用该字段指示是否需要处理记录,则可以考虑使用Y和NULL作为值.这使得索引非常小(读取速度快),占用的空间非常小.
And*_*cer 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),并且在左连接中你会将错误与不存在的记录混为一谈.
| 归档时间: |
|
| 查看次数: |
198373 次 |
| 最近记录: |