sql >> Database >  >> RDS >> Oracle

Beste query om Oracle-index te raken met binds en null-waarden

U kunt de kolom en waarde vergelijken om te zien of beide null zijn; of beide zijn niet-null en gelijk:

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) 

Wat niet erg mooi is, maar zou moeten werken. Zoals je al weet, kun je waarden niet vergelijken met null met gelijkheid, alleen de is telefoniste.

Afhankelijk van uw clientsoftware kunt u benoemde bindvariabelen gebruiken om te voorkomen dat u de bindingen moet herhalen; zo niet, dan zou u een subquery of CTE kunnen gebruiken die de bindingen opneemt en deze vervolgens in de hoofdquery gebruikt. Iets als:

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) 

De op functies gebaseerde indexbenadering van Gordon is misschien betrouwbaarder en gemakkelijker te begrijpen, zolang je echt nooit kolommen kunt hebben met de magische waarde nul. (Ik had die regel in je vraag ook gemist en had me niet gerealiseerd dat je dat al had verdisconteerd!)




  1. Vul WTForm SelectField dynamisch in met sqlAlchemy-query

  2. 4 manieren om de weergaven in een SQLite-database weer te geven

  3. Tabelfunctie met bulkverzameling genereert ongeldig gegevenstype

  4. Hoe maak je een hoofdlettergevoelige GROUP BY?