Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何创建点标识行元素的同义词_Sql_Oracle - Fatal编程技术网

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

Sql 如何创建点标识行元素的同义词,sql,oracle,Sql,Oracle,我想定义这个常量:Bool.True、Bool.False和Bool.Null,以使SQL查询更具可读性 一种可能是创建一个存储true和false值的表,并为该表创建一个名为Bool的同义词,但我不能使用Bool.true,因为这将是一个名为true的列,而不是一行中的特定值 有没有办法做到这一点,或者其他类似的方法?一种可能是创建一个名为Bool的包,其中包含名为True、False和Null的函数_ 该软件包有助于澄清“真实”的含义,但无法强制其使用 您可以使用对象类型和子类型来完成这两项

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

一种可能是创建一个存储true和false值的表,并为该表创建一个名为Bool的同义词,但我不能使用Bool.true,因为这将是一个名为true的列,而不是一行中的特定值

有没有办法做到这一点,或者其他类似的方法?一种可能是创建一个名为Bool的包,其中包含名为True、False和Null的函数_

该软件包有助于澄清“真实”的含义,但无法强制其使用

您可以使用对象类型和子类型来完成这两项工作,但这并不十分漂亮,特别是如果这只是一个简单的示例的话;但只是为了证明:

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_真和bool_假这样的东西混淆…

你当然不能为值创建同义词,不。但是你会在哪里使用它?如果在PL/SQL中,您可以只定义常量并使用它们。根据您的表思想,您可以编写类似where is_happy=select true_from bool这样的查询,但我怀疑您是否愿意这样做!使用“Y”、“N”和NULL。您的生活将变得越来越简单。或者T/F/null,或者0/1/null,或者任何对您和其他开发人员最有意义的东西。但是添加一个检查约束,这样只有您决定的特定值才能放入列中。我很难想象其他任何东西会如何使SQL查询更具可读性。@西萨克:我不知道“Y”或“N”是数字。:-'Y'表示“是”,N'表示“否”,T'表示“真”,F'表示“假”——NULL为NULL是关系数据库。你可以随心所欲地胡思乱想,试图想出某种真正的布尔表示法,而其他所有表示法都只是影子——但最终你会让自己变成一个充满问题的动物园。但是,见鬼,我做这个软件才40多年——我还有很多东西要学祝你好运。。。。我仍然认为这太过分了。与标量数据类型和检查约束相比,仍然没有什么可以阻止某人在列中输入错误的对象值。