如何创建点标识行元素的同义词

时间:2017-07-07 14:58:06

标签: sql oracle

我想定义这个常量:Bool.True,Bool.False和Bool.Null,以使SQL查询更具可读性。

一种可能性是创建一个存储true和false值的表,并为表创建一个名为“Bool”的同义词,但之后我不能使用“Bool.True”,因为那将是一个名为“真实的“,而不是连续的特定值。

有没有办法做到这一点,或类似的东西? (一种可能性是创建一个名为“Bool”的包,其函数名为“True_”,“False_”和“Null _”)

1 个答案:

答案 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_truebool_false等同样感到困惑......