Oracle
 sql >> база данни >  >> RDS >> Oracle

Най-добрата заявка за достигане на индекс на Oracle със свързвания и нулеви стойности

Можете да сравните колоната и стойността, за да видите дали и двете са нулеви; или и двете са ненулеви и равни:

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) 

Което не е много красиво, но трябва да работи. Както вече знаете, не можете да сравнявате стойности срещу null с равенство, само is оператор.

В зависимост от вашия клиентски софтуер може да сте в състояние да използвате именувани променливи за свързване, за да избегнете необходимостта от повтаряне на свързванията; ако не, можете да използвате подзаявка или CTE, която взема свързванията и след това да ги използвате в основната заявка. Нещо като:

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) 

Базираният на функцията индексен подход на Гордън може да е по-надежден и по-лесен за разбиране, стига наистина да не можете да имате колони с магическа стойност нула. (И аз бях пропуснал този ред във вашия въпрос и не бях разбрал, че вече сте го отстъпили!)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намиране на "серия" от редове от подреден резултатен набор

  2. Как мога да получа само първия ред в набор от резултати СЛЕД поръчка?

  3. Как могат полетата в този код да се обединят с различно име?

  4. Използване на DISTINCT за конкретни колони

  5. Не може да се зареди файл или сборка за Oracle.DataAccess в .NET