LNNVL - встроенная функция оракула, которая возвращает TRUE для условий, оценивающих в FALSE или UNKNOWN, и возвращает FALSE для условий, оценивающих в TRUE. Мой вопрос заключается в том, что было бы выгодно возвращать противоположность условию истины, а не просто обрабатывать значения NULL?
Например, предположим, что у вас есть таблица Emp со столбцами StartCommission и CurrentCommission, которые могут содержать нули. Следующее возвращает только строки с нулевым значением:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission;
Если вы хотите включить строки, где любая комиссия равна нулю, вы можете сделать что-то вроде этого:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission
OR StartCommission IS NULL OR CurrentCommission IS NULL;
Казалось бы, существует функция для сокращения этого синтаксиса, но использование LNNVL возвращает все неравные записи и все записи с нулями.
SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);
Добавление NOT к этому возвращает только строки без нулей. Мне кажется, что желаемая функциональность для этого случая состояла бы в том, чтобы истинные условия были истинными, ложные условия ложными, и чтобы неизвестные условия оценивались как истинные. Я действительно создал случай низкого использования здесь? Действительно ли более вероятно захотеть превратить неизвестное в истинное, истинное в ложное и ложное в истинное?
create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2));
insert into emp values (null,null);
insert into emp values (null,.1);
insert into emp values (.2,null);
insert into emp values (.3,.4);
источник
Ответы:
Это странная функция со странной историей, но так же странна и nvl2 .
lnnvl
это в основномis not true
оператор - без сомнения, его можно использовать как «nvl2
банку», но когда вам приходится искать функцию каждый раз, когда вы используете ее, чтобы напомнить вам точно, что она делает, вам остается только подумать, лучше ли придерживатьсяnvl
,coalesce
,decode
иnullif
вместе сcase
выражениями, которые являются более интуитивнымисточник
nullif
пока не понял, что это может быть очень полезным, чтобы сделать «деление на ноль» = ноль. Вы действительно находите nvl2 (a, c, b) намного лучше, чем decode (a, null, b, c)?Говоря так, я еще ни разу не использовал LNNVL за несколько лет работы программистом на DBA и PL / SQL. Иногда я использовал NVL2 (и всегда должен был искать, какая сторона была верной, а какая нет). К этому моменту кажется, что с точки зрения читабельности лучше использовать NVL, DECODE, CASE и т. Д.,
В качестве альтернативы это работает, если предположить, что кто-то хорошо разбирается в том, как Oracle обрабатывает значения NULL и арифметику, но к этому моменту можно также использовать ваш исходный запрос для удобства чтения (и план выполнения также может оказаться более сложным):
источник
StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULL
?lnnvl
.