版本 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