在 Oracle 23c 中的布尔数据类型

2023-10-23 16:18:46 浏览数 (2)

版本 23c 引入了 SQL 布尔数据类型。数据类型 boolean 具有真值 TRUE 和 FALSE。如果没有 NOT NULL 约束,布尔数据类型还支持真值 UNKNOWN 作为空值。

无论数据类型出现在 Oracle SQL 语法中,您都可以使用布尔数据类型。例如,您可以在 CREATE TABLE 中使用关键字 BOOLEAN 或 BOOL 指定布尔列:

代码语言:javascript复制
CREATE TABLE example (id NUMBER, c1 BOOLEAN, c2 BOOL);

你可以使用 SQL 关键字 TRUE、FALSE 和 NULL 分别表示状态“TRUE”、“FALSE”和“NULL”。例如,使用上面创建的表示例,您可以插入以下内容:

代码语言:javascript复制
INSERT INTO example VALUES (1, TRUE, NULL); 
INSERT INTO example VALUES (2, FALSE, true);

您可以使用文字来表示“TRUE”和“FALSE”状态。“TRUE”和“FALSE”中不强制区分大小写,可以全部小写、全部大写或大小写的组合。前导和尾随空格将被忽略。

表示“TRUE”和“FALSE”的字符串文字如下表:

STATE

TRUE

FALSE

-

'true'

'false'

-

'yes'

'no'

-

'on'

'off'

-

'1'

'0'

-

't'

'f'

-

'y'

'n'

请注意,数字转换为布尔值如下:

  • 0 转换为 FALSE。
  • 非 0 值(如 42 或 -3.14)转换为 TRUE。

给出下面使用两个布尔列 c1 和 c2 创建的表示例:

代码语言:javascript复制
CREATE TABLE example (id NUMBER, c1 BOOLEAN, c2 BOOL);

将以下行插入到 example 中:

代码语言:javascript复制
INSERT INTO example VALUES (1, TRUE, NULL);
INSERT INTO example VALUES (2, FALSE, true);
INSERT INTO example VALUES (3, 0, 'off');
INSERT INTO example VALUES (4, 'no', 'yes');
INSERT INTO example VALUES (5, 'f', 't' );
INSERT INTO example VALUES (6, false, true);
INSERT INTO example VALUES (7, 'on', 'off');
INSERT INTO example VALUES (8, -3.14, 1);

布尔类型列的 SELECT 始终返回 TRUE 、 FALSE 。NULL 值不返回任何内容。

代码语言:javascript复制
SELECT * FROM example;
ID          C1      C2
---------- -----    -----
1          TRUE  
2          FALSE    TRUE
3          FALSE    FALSE
4          FALSE    TRUE
5          FALSE    TRUE
6          FALSE    TRUE
7          TRUE     FALSE
8          TRUE     TRUE
8 rows selected.

布尔列的约束

布尔列支持以下约束:

  • NOT NULL
  • UNIQUE
  • PRIMARY KEY
  • FOREIGN KEY
  • CHECK

布尔值的比较和赋值

支持以下比较运算符来比较布尔值:=、!=、< >、<、<=、>、>=、GREATEST、LEAST、[NOT] IN

代码语言:javascript复制
SELECT * FROM example WHERE c1 = c2;

  ID   C1   C2
----------  -------   --------
   3   FALSE     FALSE
   8   TRUE      TRUE
代码语言:javascript复制
SELECT * FROM example e1
WHERE c1 >= ALL (SELECT c2 FROM example e2 WHERE e2.id > e1.id);  

  ID    C1  C2
----------   -----    -------
   1    TRUE
   7    TRUE     FALSE
   8    TRUE     TRUE

返回布尔值的布尔值运算

您可以对 SQL 条件、布尔列和布尔常量使用 NOT、AND 和 OR 运算符。例如:

代码语言:javascript复制
 SELECT * FROM example WHERE NOT c2;

  ID    C1   C2
----------   ------    ------
   3    FALSE     FALSE
   7    TRUE      FALSE
代码语言:javascript复制
SELECT * FROM example WHERE c1 AND c2;

  ID   C1      C2
----------  -----  -------
   8   TRUE    TRUE

代码语言:javascript复制
SELECT * FROM example WHERE c1 AND TRUE;

  ID    C1   C2
----------   -------  -------
   7    TRUE     FALSE
   8    TRUE     TRUE
   1    TRUE
代码语言:javascript复制
SELECT * FROM example WHERE c1 OR c2;

  ID    C1      C2
----------   -----------  -----
        1    TRUE
   2    FALSE       TRUE
   4    FALSE       TRUE
   5    FALSE       TRUE
   6    FALSE       TRUE
   7    TRUE        FALSE
   8    TRUE        TRUE

7 rows selected.

布尔运算符 NOT

NOT(真)为假。 NOT (FALSE) 为真。 NOT (NULL) 为 NULL。

布尔运算符 AND

AND 布尔运算符的真值表

AND

TRUE

FALSE

NULL

TRUE

TRUE

FALSE

NULL

FALSE

FALSE

FALSE

FALSE

NULL

FALSE

FALSE

NULL

布尔运算符 OR

OR 布尔运算符的真值表

OR

TRUE

FALSE

NULL

TRUE

TRUE

TRUE

TRUE

FALSE

TRUE

FALSE

NULL

NULL

TRUE

NULL

NULL

布尔运算符 IS

IS 布尔运算符的真值表

IS

TRUE

FALSE

NULL

TRUE

TRUE

FALSE

FALSE

FALSE

FALSE

TRUE

FALSE

NULL

FALSE

FALSE

TRUE

布尔运算符 IS NOT

IS NOT 布尔运算符的真值表

IS NOT

TRUE

FALSE

NULL

TRUE

FALSE

TRUE

TRUE

FALSE

TRUE

FALSE

TRUE

NULL

TRUE

TRUE

FALSE

除了支持 SQL 条件之外,NOT、AND 和 OR 运算符还支持对布尔列和布尔常量的操作。例如,下面这些都是有效的:

代码语言:javascript复制
SELECT * FROM example WHERE NOT c2;
SELECT * FROM example WHERE c1 AND c2;
SELECT * FROM example WHERE c1 AND TRUE;
SELECT * FROM example WHERE c1 OR c2;

您可以在布尔值表达式上使用 IS [NOT] NULL 来确定其状态。例如:

代码语言:javascript复制
SELECT * FROM example WHERE c2 IS NULL;

  ID C1         C2
---------- ----------- -----------
   1 TRUE

SQL 表达式中的布尔值

只要使用 expr,SQL 语法就支持布尔表达式。

SQL 表达式和条件已得到增强,可以支持新的布尔数据类型。

布尔数据类型和其他 Oracle 内置数据类型之间的 CAST

BOOLEAN 和其他 Oracle 内置数据类型之间的转换规则如下:

将 BOOLEAN 转换为 numeric 时:

  • 如果布尔值为 true,则结果值为 1。
  • 如果布尔值为 false,则结果值为 0。

将 numeric 转换为 BOOLEAN 时:

  • 如果数值非零(例如 1、2、-3、1.2),则结果值为 true。
  • 如果数值为零,则结果值为 false。

将 BOOLEAN 转换为 CHAR(n) 和 NCHAR(n) 时:

  • 如果布尔值为 true 并且 n 不小于 4,则结果值为“TRUE”,并在右侧扩展 n - 4 个空格。
  • 如果布尔值为 false 并且 n 不小于 5,则结果值为 'FALSE',并在右侧扩展 n – 5 个空格。
  • 否则,会引发数据异常错误。

将字符串转换为布尔值时,字符串的前导和尾随空格将被忽略。如果生成的字符串是用于确定有效布尔值的可接受文字之一,则结果就是该有效布尔值。

将 BOOLEAN 转换为 VARCHAR(n)、NVARCHAR(n) 时:

  • 如果布尔值为 true 并且 n 不小于 4,则结果值为 true。
  • 如果布尔值为 false 并且 n 不小于 5,则结果值为 false。
  • 否则,会引发数据异常错误。

您可以使用函数 TO_BOOLEAN 将字符值表达式或数值表达式显式转换为布尔值。

函数 TO_CHAR、TO_NCHAR、TO_CLOB、TO_NCLOB、TO_NUMBER、TO_BINARY_DOUBLE 和 TO_BINARY_FLOAT 具有布尔重载,用于将布尔值转换为数字或字符类型。

函数 TO_BOOLEAN

语法:

使用 TO_BOOLEAN 将字符值表达式或数值表达式显式转换为布尔值。

如果 expr 是字符串,则它的计算结果必须为允许的字符串输入。

expr 可以采用以下类型之一,或者为 null:

  • CHAR、VARCHAR2、NCHAR、NVARCHAR2 类型的字符串
  • NUMBER、BINARY_FLOAT 或 BINARY_DOUBLE 类型的数值
  • BOOLEAN 类型的布尔值。

示例:

代码语言:javascript复制
> SELECT TO_BOOLEAN(0), TO_BOOLEAN('true'), TO_BOOLEAN('no');
TO_BOOLEAN( TO_BOOLEAN( TO_BOOLEAN(
----------- ----------- -----------
FALSE       TRUE        FALSE


> SELECT TO_BOOLEAN(1) FROM DUAL;
TO_BOOLEAN( 
----------- 
TRUE

0 人点赞