create unique index
nome_do_indice
on tabela (NVL2(NULLIF(B,0), A, null) + A);
Opa, eu fiz meio correndo e já vi que coloquei coisas a mais,
mas basicamente é o seguinte, não sei se você conhece as funções NLV2
e NULLIF
trabalhando com as duas funções juntas a gente consegue simular o
IF THEN ELSE
a expressão NVL2(NULLIF(B,0), A, null) pode ser entendida da seguinte maneira:
Se B=0 então
retorne null
senão
retorne A
Como o indice UNIQUE não considera valores nulos, então se B = 0, ele vai retornar nulo o que pode possuir repetições. Caso B=1 ele retorna A
e se o A já existir, o banco lança a exceção de restrição exclusiva violada. no caso, o (+ A) do final você pode ignorar… Nem sei o que eu pensei colocando ele…
Fica mais fácil você entender a construção do índice conhecendo as funções NULLIF e NVL2, e sabendo que no Oracle nunca NULL = NULL.
Espero ter ajudado…