Как мне обращаться с нулевыми параметрами в хранимой процедуре PL / SQL, когда я хочу использовать их в сравнениях? - PullRequest
6 голосов
/ 28 октября 2010

У меня есть хранимая процедура с параметром name, которую я хочу использовать в предложении where для сопоставления со значением столбца, т.е. что-то вроде

where col1 = name

Теперь, конечно, это не удаетсясовпадение null с null из-за способа работы null.Нужно ли делать

where ((name is null and col1 is null) or col1 = name)

в подобных ситуациях или есть более краткий способ сделать это?

Ответы [ 6 ]

7 голосов
/ 28 октября 2010

Вы можете использовать функцию decode следующим образом:

where decode(col1, name, 0) is not null

Цитировать из ссылки на SQL:

В функции DECODE Oracle учитывает два нуля, чтобы быть эквивалентными.

6 голосов
/ 28 октября 2010

Я думаю, что ваше собственное предложение - лучший способ сделать это.

5 голосов
/ 28 октября 2010

То, что вы сделали, правильно. Есть более краткий способ, но он не совсем лучше:

where nvl(col1,'xx') = nvl(name,'xx')

Проблема в том, что вы должны убедиться, что значение, которое вы используете для нулей («xx» - мой пример), на самом деле не может быть реальным значением в данных.

4 голосов
/ 28 октября 2010

Если 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
2 голосов
/ 29 октября 2010

Держите это так, как есть.Он более интуитивно понятен, менее глючит, работает в любой базе данных и работает быстрее.Краткий способ не всегда лучший.См. (PLSQL). Какое простейшее выражение для проверки измененного значения в триггере Oracle при обновлении?

0 голосов
/ 27 августа 2014
SELECT * FROM table
WHERE paramater IS NULL OR column = parameter;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...