Что лучше сравнивать с NULL или использовать функцию NVL? - PullRequest
0 голосов
/ 28 ноября 2018

Какой подход лучше получить на выходе всех записей, если вход NULL или конкретная запись, когда вход NOT NULL?Это для PL / SQL в базе данных Oracle.Дайте мне знать, если мой первый подход неверен

select * from student where (roll_no = :ROLL_NO or :ROLL_NO is NULL);

ИЛИ

select * from student where roll_no = NVL(:ROLL_NO, roll_no);

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Уильям Робертсон сделал хорошую мысль.Я понял свою ошибку тогда.Я попробовал ответ Гордона Линоффа.Это сработало.Я думаю, что ответ Вальдеморта также будет правдой, но я не пробовал.

Этот ответ, приведенный ниже, является моим решением, и он может быть похож на ответ Вальдеморта.

{select * from student where AND (roll_no = nvl(roll_no,1) = nvl(:roll_no,1)}

Спасибо за помощь, ребята

0 голосов
/ 28 ноября 2018

Два подхода дадут разные результаты, где roll_no равно нулю, поскольку roll_no = roll_no не будет истинным для этих строк.

При наличии индекса оптимизатор имеет специальный случай для somecol = nvl(:param,somecol), и вы увидите две FILTER операции и CONCATENATION в плане выполнения, представляющие случаи, когда :param равно нулю или не равно нулю.Поэтому я бы использовал выражение nvl, если roll_no определен как столбец NOT NULL.

0 голосов
/ 28 ноября 2018
Подход

Секунды дал бы тот же результат с небольшой модификацией (нельзя сравнить ноль с нулем):

select * from student where NVL(roll_no,1) = NVL(NVL(:ROLL_NO, roll_no),1);
0 голосов
/ 28 ноября 2018

В общем, использование операторов - лучший подход.Это связано с тем, что оптимизатор может быть умнее, когда столбцы не являются аргументами функций.

В этом ответе предполагается, что roll_no не является null.

Хотя это может быть случай, когдаОптимизатор Oracle иногда ловит, вы можете обнаружить, что написание запроса с использованием union all на самом деле дает лучший план выполнения при наличии соответствующего индекса:

select s.*
from student s
where roll_no = :ROLL_NO
union all
select s.*
from student s
where :ROLL_NO is NULL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...