Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Najlepsze zapytanie, aby trafić na indeks Oracle z wiązaniami i wartościami null

Możesz porównać kolumnę i wartość, aby sprawdzić, czy oba mają wartość null; lub oba są niezerowe i równe:

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 nie jest strasznie ładne, ale powinno działać. Jak już wiesz, nie możesz porównywać wartości z wartością null z równością, tylko is operatora.

W zależności od oprogramowania klienckiego możesz być w stanie użyć nazwanych zmiennych wiązania, aby uniknąć konieczności powtarzania wiązań; jeśli nie, możesz użyć podzapytania lub CTE, które pobiera wiązania, a następnie używa ich w głównym zapytaniu. Coś takiego:

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) 

Podejście Gordona oparte na indeksie może być bardziej niezawodne i łatwiejsze do zrozumienia, o ile naprawdę nie możesz mieć żadnych kolumn z magiczną wartością zero. (Ja też przegapiłem tę linijkę w twoim pytaniu i nie zdawałem sobie sprawy, że już ją zdyskontowałeś!)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przerwij program PL/SQL

  2. jak zmodyfikować istniejące ograniczenie sprawdzania?

  3. Oracle SQL — jak pobrać najwyższe 5 wartości z kolumny

  4. ORA-00604 ORA-12705

  5. Jak napisać kod w Oracle SQL (np. „CCYYMMDD” w 102 )