如何在 Oracle 12c 中创建带条件的索引?

Posted

技术标签:

【中文标题】如何在 Oracle 12c 中创建带条件的索引?【英文标题】:How to create indexes with conditions in Oracle 12c? 【发布时间】:2017-09-25 13:16:21 【问题描述】:

我想将一个 PostgreSQL 数据库迁移到 Oracle 12c 中,例如在下面的表创建中,我发现了一些困难:

如何(如果可能)使用 where 子句创建这些唯一索引? 如何正确添加这个主键pessoa_id? 为什么我收到此错误“缺少右括号”?

代码:

create table nano.pessoa (
    id              GENERATED BY DEFAULT ON NULL AS IDENTITY,
    nome            varchar(99) not null, 
    sobrenome       varchar(99) not null, 
    nascimento_dt   date,
    registro        varchar(32) not null,   
    fisica_sn       bool default true,   -- no caso de pf, true, pf, falso
    matriz_sn       bool default false,  -- no caso de pf, é o genero, masculino = true
    confirmado_sn   bool default false,
    constraint pessoa_id primary key(id)
);  

create unique index pessoa_juridica_cnpj_ix on pessoas.pessoa (registro) where (fisica_sn = false);
create unique index pessoa_fisica_ix on pessoas.pessoa (nome, sobrenome, nascimento_dt) where (fisica_sn = true);
create unique index pessoa_fisica_cpf_ix on pessoas.pessoa (registro) where ((fisica_sn = true) and ((registro <> null) and (registro <> ''))); 

【问题讨论】:

相关:***.com/questions/5939776/… 【参考方案1】:

Oracle DB 中没有条件索引,您可以将逻辑转换为基于函数的索引。

所以如下:

create unique index pessoa_juridica_cnpj_ix on pessoa (registro) where (fisica_sn = false);

成为Oracle SQL:

create unique index pessoa_juridica_cnpj_ix on pessoa (case when fisica_sn = false then registro end) ;

【讨论】:

fisica_sn = false 而不是 fisica_sn is null

以上是关于如何在 Oracle 12c 中创建带条件的索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中创建带重音的索引

oracle 12c 新特性之不可见字段

如何在 QOpenGLTexture 中创建带 alpha 的纹理?

如何在 django 中创建带参数的链接

如何在 Android 中创建带圆角的 ListView?

如何在 oracle 12c 中创建导出表作业