sql >> Database teknologi >  >> RDS >> Oracle

Bedste forespørgsel til at ramme Oracle-indeks med binds og null-værdier

Du kan sammenligne kolonnen og værdien for at se, om begge er nul; eller begge er ikke-nul og ens:

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) 

Hvilket ikke er særlig kønt, men det burde virke. Som du allerede ved, kan du ikke sammenligne værdier med nul med lighed, kun is operatør.

Afhængigt af din klientsoftware kan du muligvis bruge navngivne bindingsvariabler for at undgå at skulle gentage bindingerne; hvis ikke, kan du bruge en underforespørgsel eller CTE, som tager bindene og derefter bruge dem i hovedforespørgslen. Noget som:

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) 

Gordons funktionsbaserede indekstilgang kan være mere pålidelig og lettere at forstå, så længe du virkelig aldrig kan have nogen kolonner med den magiske værdi nul. (Jeg havde også savnet den linje i dit spørgsmål og havde ikke indset, at du allerede havde regnet med det!)




  1. Installer Mtop (MySQL Database Server Monitoring) i RHEL/CentOS 6/5/4, Fedora 17-12

  2. Kører Parallel Hint i Dynamic SQL i Oracle parallelt?

  3. Sådan forhindres 'ugyldig inputsyntaks for type json' i Postgres, når poster indeholder en blanding af json eller strenge

  4. MySQL:genbrug automatisk stigning under indsættelse