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

时间:2017-04-27 16:13:16

标签: oracle indexing database-migration

我想将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 <> ''))); 

1 个答案:

答案 0 :(得分:2)

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 is null then registro end) ;