我想定义这个常量:Bool.True,Bool.False和Bool.Null,以使SQL查询更具可读性。
一种可能性是创建一个存储true和false值的表,并为表创建一个名为“Bool”的同义词,但之后我不能使用“Bool.True”,因为那将是一个名为“真实的“,而不是连续的特定值。
有没有办法做到这一点,或类似的东西? (一种可能性是创建一个名为“Bool”的包,其函数名为“True_”,“False_”和“Null _”)
答案 0 :(得分:0)
该软件包有助于澄清" true _"的含义,但无法强制执行。
你可以使用对象类型和子类型来做到这两点,但它并不是非常漂亮,特别是如果这只是一个简单的例子;但只是为了证明:
create type bool as object (
flag number(1)
)
not final not instantiable
/
create type bool_false under bool (
constructor function bool_false return self as result
)
final
/
show errors;
create type body bool_false as
constructor function bool_false return self as result is
begin
self.flag := 0;
return;
end;
end;
/
create type bool_true under bool (
constructor function bool_true return self as result
) final
/
create type body bool_true as
constructor function bool_true return self as result is
begin
self.flag := 1;
return;
end;
end;
/
然后你可以使用超类型(不能实例化)来创建一个包含列的表,你可以将任何一种类型的实例放入其中:
create table t42 (id number, bool_flag bool);
insert into t42 values (1, bool_true());
insert into t42 values (2, bool_false());
insert into t42 values (3, null);
select * from t42;
ID BOOL_FLAG(FLAG)
---------- ---------------
1 BOOL_TRUE(1)
2 BOOL_FALSE(0)
3
3 rows selected.
或过滤它:
select * from t42 where bool_flag = bool_true();
ID BOOL_FLAG(FLAG)
---------- ---------------
1 BOOL_TRUE(1)
1 row selected.
但是,您无法在对象类型列上创建索引,这可能是个问题。你可以有一个FBI,但随后查询变得更加复杂。
使用标量数据类型和检查约束仍然更简单,例如有一个数字:
create table t42 (id number, bool_flag number(1) check (bool_flag in (1,0)));
insert into t42 values (1, 1);
insert into t42 values (2, 0);
insert into t42 values (3, null);
或单个字符,T?F或Y / N或其他适合您的字符:
create table t42 (id number, bool_flag varchar2(1) check (bool_flag in ('T','F')));
insert into t42 values (1, 'T');
insert into t42 values (2, 'F');
insert into t42 values (3, null);
或者如果您真的担心未来的开发人员会对T和F的含义感到困惑,您甚至可以存储整个单词 - 当然还需要额外的存储成本:
create table t42 (id number, bool_flag varchar2(5) check (bool_flag in ('TRUE','FALSE')));
insert into t42 values (1, 'TRUE');
insert into t42 values (2, 'FALSE');
insert into t42 values (3, null);
如果他们被真/假弄糊涂了,他们会被bool_true
和bool_false
等同样感到困惑......