LNNVL es una función integrada de oráculo que devuelve VERDADERO para las condiciones que evalúan como FALSO o DESCONOCIDO, y devuelve FALSO para las condiciones que evalúan como VERDADERO. Mi pregunta es ¿cuál sería el beneficio de devolver lo contrario de la condición de verdad en lugar de solo manejar los valores NULL?
Por ejemplo, suponga que tiene una tabla Emp con columnas StartCommission y CurrentCommission que pueden contener valores nulos. Lo siguiente devuelve solo filas sin valor nulo:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission;
Si desea incluir filas donde cualquiera de las comisiones es nula, puede hacer algo como esto:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission
OR StartCommission IS NULL OR CurrentCommission IS NULL;
Parecería que existiría una función para acortar esta sintaxis, pero el uso de LNNVL devuelve todos los registros no iguales y todos los registros con valores nulos.
SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);
Agregar NOT a esto solo devuelve filas sin nulos. Me parece que la funcionalidad deseada para este caso sería mantener las condiciones verdaderas verdaderas, las condiciones falsas falsas y que las condiciones desconocidas se evalúen como verdaderas. ¿Realmente he creado un caso de bajo uso aquí? ¿Es realmente más probable que desee convertir lo desconocido en verdadero, verdadero en falso y falso en verdadero?
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);
fuente
Respuestas:
Es una función extraña con un historial extraño , pero también lo es nvl2 raro.
lnnvl
es básicamente unis not true
operador; sin duda, se puede usar comonvl2
puede, pero cuando tienes que buscar una función cada vez que la usas para recordarte exactamente lo que hace, te preguntas si es mejor seguirla.nvl
,coalesce
,decode
ynullif
junto concase
las expresiones, que son más intuitivofuente
nullif
hasta que me di cuenta de que puede ser de gran ayuda para hacer 'división por cero' = nulo. ¿Realmente encuentras nvl2 (a, c, b) mucho mejor que decodificar (a, null, b, c)?Dicho de esta manera, todavía no he usado LNNVL una vez en mis varios años de ser un programador DBA y PL / SQL. He usado NVL2 en ocasiones (y siempre tuve que buscar qué lado era cierto y qué lado no). En ese punto, parece mejor desde una perspectiva de legibilidad terminar usando NVL, DECODE, CASE, etc.
Alternativamente, esto funciona, suponiendo que uno tenga un buen manejo de cómo Oracle maneja los valores NULL y aritméticos, pero en este punto, uno puede usar su consulta original para facilitar la lectura (y el plan de ejecución también puede ser más difícil):
fuente
StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULL
?lnnvl
.