Если col1
проиндексирован, было бы лучше (с точки зрения производительности) разделить запрос на два:
SELECT *
FROM mytable
WHERE col1 = name
UNION ALL
SELECT *
FROM mytable
WHERE name IS NULL AND col1 IS NULL
Таким образом, Oracle
может оптимизировать оба запроса независимо, поэтому первыйили вторая часть не будет фактически выполнена в зависимости от того, передано ли name
NULL
или нет.
Oracle
, тем не менее, не индексирует NULL
значения полей, поэтому поиск *Значение 1012 * всегда приведет к полному сканированию таблицы.
Если ваша таблица большая, содержит несколько значений NULL
и вы часто ищете их, вы можете создать индекс на основе функции:
CREATE INDEX ix_mytable_col1__null ON mytable (CASE WHEN col1 IS NULL THEN 1 END)
и использовать его в запросе:
SELECT *
FROM mytable
WHERE col1 = name
UNION ALL
SELECT *
FROM mytable
WHERE CASE WHEN col1 IS NULL THEN 1 END = CASE WHEN name IS NULL THEN 1 END