LNNVL jest wbudowaną funkcją wyroczni, która zwraca PRAWDA dla warunków ewaluujących do FAŁSZ lub NIEZNANY, i zwraca FAŁSZ dla warunków ewaluujących do PRAWDA. Moje pytanie brzmi: jaka byłaby korzyść ze zwrócenia przeciwieństwa warunku prawdy, a nie tylko obsługi wartości NULL?
Załóżmy na przykład, że masz tabelę Emp z kolumnami StartCommission i CurrentCommission, która może zawierać wartości null. Poniższe zwraca tylko wiersze bez wartości null:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission;
Jeśli chcesz dołączyć wiersze, w których prowizja jest zerowa, możesz zrobić coś takiego:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission
OR StartCommission IS NULL OR CurrentCommission IS NULL;
Wydaje się, że istnieje funkcja skracająca tę składnię, ale użycie LNNVL zwraca wszystkie nierównomierne rekordy i wszystkie rekordy z zerami.
SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);
Dodanie NOT do tego zwraca tylko wiersze bez wartości null. Wydaje mi się, że pożądaną funkcjonalnością w tym przypadku byłoby utrzymanie prawdziwych warunków prawdziwych, fałszywych warunków fałszywych, a nieznane warunki ocenione jako prawdziwe. Czy naprawdę stworzyłem tutaj przypadek niskiego użycia? Czy naprawdę bardziej prawdopodobne jest, że zechce przekształcić nieznane w prawdziwe, prawdziwe w fałszywe, a fałszywe w prawdziwe?
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);
źródło
Odpowiedzi:
To dziwna funkcja z dziwną historią - ale tak samo jest z NVL2 .
lnnvl
jest w zasadzieis not true
operatorem - bez wątpienia można go dobrze wykorzystaćnvl2
, ale gdy trzeba za każdym razem szukać funkcji, aby przypomnieć jej dokładnie, co robi, pozostaje się zastanawiać, czy najlepiej trzymać się tej funkcjinvl
,coalesce
,decode
anullif
wraz zcase
wyrażeń, które są bardziej intuicyjneźródło
nullif
dopóki nie zdałem sobie sprawy, że może być świetną pomocą w dzieleniu przez zero na zero. Czy naprawdę uważasz, że nvl2 (a, c, b) jest znacznie lepszy niż dekodowanie (a, null, b, c)?Ujmując to w ten sposób, jeszcze raz nie korzystałem z LNNVL przez kilka lat pracy jako programista DBA i PL / SQL. Czasami korzystałem z NVL2 (i zawsze musiałem sprawdzić, która strona była prawdziwa, a która nie). W tym momencie wydaje się lepiej z punktu widzenia czytelności, aby używać NVL, DECODE, CASE itp.,
Alternatywnie działa to, zakładając, że dobrze rozumiesz, w jaki sposób Oracle obsługuje wartości NULL i arytmetykę, ale do tego momentu można równie dobrze użyć oryginalnego zapytania o czytelność (a plan wykonania może również wymagać mocniejszego trafienia):
źródło
StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULL
?lnnvl
.