26ai新特性实战:BOOLEAN 数据类型
胖头鱼的技术专栏-451 26ai新特性实战:BOOLEAN 数据类型(20260725)
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database
PostgreSQL ACE
10 年 + 数据库行业经验
拥有 OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP 等认证
墨天轮 MVP,ITPUB 认证专家
圈内拥有“总监”称号,非著名社恐(社交恐怖分子)
全网同名:胖头鱼的鱼缸
ITPUB:yhw1809
除授权转载并标明出处外,均为“非法”抄袭
特性介绍
Oracle AI Database 23.26.1 引入了原生的 BOOLEAN 数据类型支持。此前 BOOLEAN 类型仅在 PL/SQL 中可用,现在可以直接用于 SQL 表列定义、查询条件和 DML 操作。这使得 Oracle 数据库与 ISO SQL 标准保持一致,同时也方便了从其他数据库系统(如 PostgreSQL)的迁移。
特性细节:
BOOLEAN 列可以存储三种值:TRUE、FALSE 和 NULL 在 WHERE 子句中可以直接使用布尔比较:WHERE is_active = TRUE 支持 NOT 运算符取反:WHERE NOT is_active 支持 CASE WHEN 对 BOOLEAN 列进行条件分支 支持 UPDATE 语句对 BOOLEAN 列取反 支持列级别 DEFAULT 值:DEFAULT TRUE / DEFAULT FALSE 支持 IS NULL 和 IS NOT NULL 判断 INSERT 时可以使用字面量 TRUE/FALSE/NULL
语法介绍
语法示例:
CREATE TABLE t (id NUMBER, flag BOOLEAN DEFAULT TRUE);
INSERT INTO t VALUES (1, TRUE);
SELECT * FROM t WHERE flag = TRUE;
UPDATE t SET flag = NOT flag WHERE id = 1;
注意事项
BOOLEAN 不能直接与数字 0/1 互转,需要使用 CASE 或 DECODE 进行转换 不支持对 BOOLEAN 列进行算术运算 BOOLEAN 列不能作为索引键(主键或唯一约束除外) BOOLEAN 类型的显示格式取决于客户端设置
适用场景
状态标记:用户是否激活、记录是否有效、订单是否完成等 业务规则:VIP 客户标记、特殊权限标记、审核状态等 数据迁移:从 PostgreSQL、MySQL 等数据库迁移含布尔列的表 简化查询:替代 NUMBER(1) 或 CHAR(1) 的 Y/N 模式,使代码更可读 条件过滤:使用简洁的 WHERE NOT is_deleted 替代复杂条件
实战演示
同之前一样,使用用户NFTEST,已授权DB_DEVELOPER_ROLE角色,测试操作均在NFTEST用户下执行。
创建测试表并添加测试数据
CREATE TABLE test_bool (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
is_active BOOLEAN,
is_vip BOOLEAN
);
INSERT INTO test_bool VALUES (1, 'Alice', TRUE, FALSE);
INSERT INTO test_bool VALUES (2, 'Bob', FALSE, TRUE);
INSERT INTO test_bool VALUES (3, 'Carol', NULL, NULL);
COMMIT;
测试1:SELECT 中使用 BOOLEAN 比较
SELECT id, name, is_active, is_vip
FROM test_bool
WHERE is_active = TRUE
ORDER BY id;
测试2:SELECT 中 适用 NOT
SELECT id, name, is_active, is_vip
FROM test_bool
WHERE NOT is_active
ORDER BY id;
测试3:在 BOOLEAN 列适用 CASE WHEN
SELECT
id, name,
is_active,
is_vip,
CASE WHEN is_active THEN 'Active' ELSE 'Inactive' END AS status,
CASE WHEN is_vip THEN 'VIP' ELSE 'Regular' END AS tier
FROM test_bool
ORDER BY id;
测试4:更新一个否定 BOOLEAN 值
UPDATE test_bool
SET is_active = NOT is_active
WHERE id = 1;
COMMIT;
SELECT id, name, is_active, is_vip
FROM test_bool
WHERE id = 1;
测试5:创建包含默认 TRUE 和 FALSE 值的表
CREATETABLE test_bool_defaults (
id NUMBER PRIMARY KEY,
name VARCHAR2(50),
is_enabled BOOLEAN DEFAULT TRUE,
is_deleted BOOLEAN DEFAULT FALSE
);
INSERT INTO test_bool_defaults (id, name) VALUES (1, 'DefaultRow');
INSERT INTO test_bool_defaults (id, name, is_enabled, is_deleted)
VALUES (2, 'OverrideRow', FALSE, TRUE);
COMMIT;
SELECT id, name, is_enabled, is_deleted
FROM test_bool_defaults
ORDER BY id;
测试6:在 BOOLEAN 列上使用 IS NULL / IS NOT NULL
SELECT id, name, is_active, is_vip
FROM test_bool
WHERE is_active IS NULL
ORDER BY id;
SELECT id, name, is_active, is_vip
FROM test_bool
WHERE is_active IS NOT NULL
ORDER BY id;
SELECT id, name, is_active, is_vip
FROM test_bool
WHERE is_vip IS NOT NULL
ORDER BY id;
总结
本期对 Oracle AI Database 26ai,23.26.1 版本新引入的 BOOLEAN 数据类型进行了完整介绍与实战演示。
老规矩,知道写了些啥。