昨天我想给一个Oracle表添加一个布尔字段。但实际上,Oracle没有布尔数据类型。这里有没有人知道模拟布尔的最佳方法?通过谷歌搜索这个问题,发现了几种方法:
使用整数,并且只需要分配0或1。
使用具有“Y”或“N”作为唯二值的字符字段。
使用带有CHECK约束的枚举。
有经验的Oracle开发人员知道哪种方法是首选/规范吗?
昨天我想给一个Oracle表添加一个布尔字段。但实际上,Oracle没有布尔数据类型。这里有没有人知道模拟布尔的最佳方法?通过谷歌搜索这个问题,发现了几种方法:
使用整数,并且只需要分配0或1。
使用具有“Y”或“N”作为唯二值的字符字段。
使用带有CHECK约束的枚举。
有经验的Oracle开发人员知道哪种方法是首选/规范吗?
我发现这个链接很有用。
以下是一个段落,其中列举了每种方法的一些优缺点。
最常见的设计是模仿 Oracle 数据字典视图使用的许多布尔式标识,选择 'Y' 表示 true,选择 'N' 表示 false。然而,为了与主机环境(例如 JDBC、OCCI 和其他编程环境)正确交互,选择 0 表示 false,选择 1 表示 true 更好,因为这样可以正确地与 getBoolean 和 setBoolean 函数配合使用。
基本上,他们提倡第二种方法,出于效率考虑,使用:
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作为值。这样可以创建一个非常小的(读取快速)索引,占用非常少的空间。
为了使用最少的空间,您应该使用一个被限制为 'Y' 或 'N' 的 CHAR 字段。 Oracle 不支持 BOOLEAN、BIT 或 TINYINT 数据类型,因此 CHAR 的一个字节是您能够获得的最小大小。
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
some_column is null
而不是 some_column = 0
)而且在左连接中,您会将错误与不存在的记录混淆。可以使用1/0或Y/N的检查约束。两种方式都可以。个人更喜欢使用1/0,因为我在perl中做了很多工作,这使得在数据库字段上进行perl布尔运算变得非常容易。
如果您想要与Oracle高管之一就此问题进行深入讨论,请查看Tom Kyte在此处的发言。
计算真实行数:
SELECT SUM(CASE WHEN BOOLEAN_FLAG = 'Y' THEN 1 ELSE 0) FROM X
在对行进行分组时,强制执行“如果一行为真,则所有行都为真”的逻辑:
SELECT MAX(BOOLEAN_FLAG) FROM Y
相反,如果有一行为假,则使用MIN来强制分组为假。
以下是一个可行的示例,用于将“布尔”列添加到 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
。