Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Melhor consulta para atingir o índice Oracle com vínculos e valores nulos


Você pode comparar a coluna e o valor para ver se ambos são nulos; ou ambos são não nulos e iguais:
SELECT * FROM MYTABLE 
WHERE ((A is null and :1 is null) or A = :1) 
  AND ((B is null and :2 is null) or B = :2) 
  AND ((C is null and :3 is null) or C = :3) 
  AND ((D is null and :4 is null) or D = :4) 
  AND ((E is null and :5 is null) or E = :5) 

O que não é muito bonito, mas deve funcionar. Como você já sabe, não pode comparar valores com null com igualdade, apenas o is operador.

Dependendo de seu software cliente, você poderá usar variáveis ​​de ligação nomeadas para evitar ter que repetir as ligações; caso contrário, você pode usar uma subconsulta ou CTE que recebe os vínculos e os usa na consulta principal. Algo como:
WITH CTE AS (
  SELECT :1 AS val_1, :2 AS val_2, :3 AS val_3, :4 AS val_4, :5 AS val_5
  FROM DUAL
)
SELECT MT.*
FROM CTE
JOIN MYTABLE MT
  ON ((MT.A is null and CTE.val_1 is null) or MT.A = CTE.val_1) 
 AND ((MT.B is null and CTE.val_2 is null) or MT.B = CTE.val_2) 
 AND ((MT.C is null and CTE.val_3 is null) or MT.C = CTE.val_3) 
 AND ((MT.D is null and CTE.val_4 is null) or MT.D = CTE.val_4) 
 AND ((MT.E is null and CTE.val_5 is null) or MT.E = CTE.val_5) 

A abordagem de índice baseado em função de Gordon pode ser mais confiável e fácil de entender, desde que você realmente não possa ter nenhuma coluna com o valor mágico zero. (Eu também perdi essa linha na sua pergunta e não percebi que você já havia descontado isso!)