【问题标题】:Is there any boolean type in Oracle databases?Oracle 数据库中有布尔类型吗?
【发布时间】:2011-04-13 05:01:14
【问题描述】:

Oracle 数据库中是否有布尔类型,类似于 Ms SQL Server 中的BIT 数据类型?

【问题讨论】:

  • 不幸的是,Oracle 在引入该标准时并不完全支持 ANSI SQL:1999 标准 (en.wikipedia.org/wiki/SQL:1999)。
  • 另一种观点(为什么 SQL 不应该有布尔类型):vadimtropashko.wordpress.com/2010/09/16/…
  • @JeffreyKemp 该博客毫无意义。仅仅因为某些布尔值可以基于表中的其他字段计算,并不意味着可以计算所有布尔字段。例如“is_trusted_customer”,当且仅当一个人决定“我信任那个人”时这是真的。
  • @JeffreyKemp 恭喜,您刚刚重新发明了 C 风格的布尔值(您使用 ints 代替)。我们绝对应该回到代码中的那些。此外,如果表列和 result 列(来自SELECT)之间的数据类型是共享的,则该参数完全崩溃,因为有时甚至给定返回布尔值作为计算结果是绝对合适的论点的其余部分。
  • 是的。像布尔值这样的更多数据类型会提供更精确的表达能力——在这方面你不会从我这里得到任何论据。我很高兴我们至少有一个 DATE 类型 - 想象一下必须一直处理日期的字符串表示:)

标签: sql database oracle boolean sqldatatypes


【解决方案1】:

Oracle 的 SQL(不是 PL/SQL)中不仅缺少布尔数据类型,而且他们也没有明确的建议来代替使用什么。请参阅 asktom 上的 this thread。当有人指出'Y'/'N' 取决于英语时,他们从推荐CHAR(1) 'Y'/'N' 切换到NUMBER(1) 0/1,而例如德国程序员可能会改用'J'/'N'

最糟糕的是,他们捍卫这个愚蠢的决定,就像他们捍卫 ''=NULL 愚蠢一样。

【讨论】:

  • 1/0 是,如果不是模棱两可的话,至少不那么模棱两可。
  • 但是 ''=NULL 是假的! '' IS NULL 为真。 :)
  • Michael-O:我已经看过好几次了。对我来说,一直是 0/1,但其他程序员更喜欢 J/N。 (我住在一个讲德语的国家)
  • @Irfy 最近看到NF被用了,因为ONOFF是同一个字母开头的……
  • 有人可能会争辩说,作为布尔值的替代,'T'/'F' 更有意义
【解决方案2】:

没有。

可以使用:

IS_COOL NUMBER(1,0)

1 - true
0 - false

---享受甲骨文

或者使用char Y/N as described here

【讨论】:

  • 我更喜欢 char(1),因为它占用的空间更少。您可以这样检查:create table testbool (boolc char(1), booln number(1)); insert into testbool values ('Y', 1 ); select dump(boolc), dump(booln) from testbool; 存储的 CHAR:Typ=96 Len=1: 89 和 NUMBER:Typ=2 Len=2: 193,2 至少在 12c 中,NUMBER(1) 可以使用 2 个字节...
【解决方案3】:

根据 Ammoq 和 kupa 的回答,我们使用默认值为 0 的 number(1) 并且不允许空值。

这里有一个添加列来演示:

ALTER TABLE YourSchema.YourTable ADD (ColumnName NUMBER(1) DEFAULT 0 NOT NULL);

希望这对某人有所帮助。

【讨论】:

  • 请注意,您也可以在其中存储 -1。您可以在其上添加一个检查约束以将值限制为 0 和 1。
  • @DavidAldridge 在布尔逻辑中,任何非 0 (FALSE) 的数字都等价于 1 (TRUE),因此存储的数字无关紧要,无需检查约束。添加一个从 int 返回布尔值的函数很简单:boolean intToBool(int in) { return (in != 0); }
  • @AgiHammerthief 是的,但是如果您想使用“布尔”列上的谓词查找行,我宁愿知道我的选项是ColumnName = 0ColumnName = 1,而不是ColumnName = 0ColumnName <> 0。最后一个的语义对程序员不友好。我还希望通过具有两个值来使查询优化器更简单。
【解决方案4】:

不,Oracle 数据库中没有布尔类型,但您可以这样做:

您可以对列设置检查约束。

如果您的表格没有检查列,您可以添加它:

ALTER TABLE table_name
ADD column_name_check char(1) DEFAULT '1';

当你添加一个寄存器时,默认情况下此列得到 1。

在这里你放了一个限制列值的检查,只放 1 或 0

ALTER TABLE table_name ADD
CONSTRAINT name_constraint 
column_name_check (ONOFF in ( '1', '0' ));

【讨论】:

    【解决方案5】:

    不在 SQL 级别,很遗憾 不过PLSQL中有一个

    【讨论】:

      【解决方案6】:

      不,不存在 boolean 类型,但您可以使用 1/0(类型编号)或 'Y'/'N'(类型 char)或 'true'/'false'(类型varchar2)。

      【讨论】:

        【解决方案7】:

        有一个boolean type for use in pl/sql,但没有一个可以用作列的数据类型。

        【讨论】:

          【解决方案8】:

          如果您将 Java 与 Hibernate 一起使用,那么使用 NUMBER(1,0) 是最好的方法。正如您在here 中看到的那样,该值会被 Hibernate 自动转换为布尔值。

          【讨论】:

            【解决方案9】:

            一个常见的节省空间的技巧是将 boolean 值存储为 Oracle CHAR,而不是 NUMBER:

            【讨论】:

            • CHAR(1) 和 VARCHAR2(1) 在空间使用上是相同的。
            • 正如我在这里学到的docs.oracle.com/cd/E17952_01/refman-5.5-en/char.html 当我们讲述一个字符时,只有 char 和 varchar 之间存在区别 - char 使用 1 个字节,但 varchar 使用 1 个字节作为空白空间 + 1 个字节作为一个字符 -> varchar(varchar2) 对 1 个字符使用 2 个字节
            • @Artem.Borysov:该手册适用于 MySQL,而不适用于 Oracle 数据库
            【解决方案10】:

            只是因为还没有人提到它:使用 RAW(1) 似乎也很常见。

            【讨论】:

            • raw(1) 很棒,因为用户不能假设其中有什么,进行查询的人必须了解 raw(1) 列中的内容并将其翻译成有意义的东西.
            • 是的,它太棒了,你不能用它编写可移植的 jdbc 代码。
            • @jacob - 这是一个了不起的想法!我们应该摆脱所有其他数据类型并将所有内容存储在 RAW 列中!那么 NOBODY 可以任意曲解数据!
            • 想象一下,如果 oracle 中有某种方法可以定义数据类型,以便我们可以创建一个包装“raw(1)”类型的 bool 类型,将其命名为 bool 或 boolean。然后我们可以定义一个函数来根据内容打印“true”或“false”。
            【解决方案11】:
            DECLARE
            error_flag  BOOLEAN := false;
            BEGIN
            
            error_flag := true;
            --error_flag := 13;--expression is of wrong type
            
              IF error_flag THEN 
            
            UPDATE table_a SET id= 8 WHERE id = 1;
            
            END IF;
            END;
            

            【讨论】:

            • 这个例子有效。我还注意到我只能在 PL/SQL 中使用布尔类型。 SQL 中的布尔调用不会,并且会产生无效的关系运算符错误。
            猜你喜欢
            • 1970-01-01
            • 2015-07-09
            • 2014-03-02
            • 2018-06-07
            • 2011-06-13
            • 2018-07-17
            • 1970-01-01
            • 1970-01-01
            • 2011-05-30
            相关资源
            最近更新 更多