sql >> Databáze >  >> RDS >> Oracle

Nejlepší dotaz pro zásah do indexu Oracle s vazbami a hodnotami null

Můžete porovnat sloupec a hodnotu a zjistit, zda jsou oba null; nebo obě nejsou-null a rovny:

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) 

Což není moc hezké, ale mělo by to fungovat. Jak již víte, nemůžete porovnávat hodnoty s hodnotou null s rovností, pouze is operátor.

V závislosti na vašem klientském softwaru možná budete moci použít pojmenované proměnné vazby, abyste se vyhnuli nutnosti opakování vazeb; pokud ne, můžete použít poddotaz nebo CTE, který převezme vazby a poté je použije v hlavním dotazu. Něco jako:

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) 

Gordonův indexový přístup založený na funkcích může být spolehlivější a snáze pochopitelný, pokud opravdu nikdy nemůžete mít žádné sloupce s magickou hodnotou nula. (Také jsem tento řádek ve vaší otázce přehlédl a neuvědomil jsem si, že jste to již zlevnili!)




  1. Připojení k Microsoft Access v IRI Workbench

  2. Automatizujte hromadné načítání dat z s3 do instance Aurora MySQL RDS

  3. Escapování speciálních znaků v to_tsquery

  4. Dotaz WHERE_IN se složeným klíčem?