Você já precisou garantir uma regra de negócio no banco de dados onde a unicidade se aplica apenas a alguns registros da tabela?
Veja este caso. Preciso garantir a unicidade para uma tabela de formas de pagamento apenas quando o tipo da forma de pagamento for cartão. Quero garantir que não haverão mais de um cartão para mesma autorizadora.
Posso fazer isto usando o decode:

create index idx_forma_pagamento_cartao on tipo_caixa
(
decode(tipo_forma_pagamento, 'CARTAO', codigo_forma_pagamento || '-'|| autorizadora_key, null)
);

Ou usando case when:

create index idx_forma_pagamento_cartao on forma_pagamento
(
   case when tipo_forma_pagamento = 'CARTAO', then
     codigo_forma_pagamento || '-'|| autorizadora_key
   else
     null
   end
);

 
Desta forma, o Oracle só vai verificar a combinação codigo_forma_pagamento e autorizadora_key quando a forma de pagamento for cartão.
Tem alguma dúvida, sugestão ou critica?
Deixe seu comentário mais abaixo.
Até a próxima!

Autor

Ismael Soares é Gerente de Engenharia de Software na Bluesoft em São Paulo. É formado em banco de dados pela Faculdade Impacta de Tecnologia e possui mais de 14 anos com experiências em análise e desenvolvimento de sistemas. Já trabalhou com diversas tecnologias, entre elas: VB6, ASP, PHP, C#.NET, VB.NET, ASP.NET, PL/SQL, T-SQL, Groovy, Ruby e Java. Já participou de diversos projetos com banco de dados entre eles: Oracle, MSSQL Server, MySQL e Postgree.

Deixe aqui o seu comentário