LNNVL ist eine in Oracle integrierte Funktion , die TRUE für Bedingungen zurückgibt, die zu FALSE oder UNKNOWN ausgewertet werden, und FALSE für Bedingungen, die zu TRUE ausgewertet werden. Meine Frage ist, was der Vorteil wäre, das Gegenteil der Wahrheitsbedingung zurückzugeben, anstatt nur mit den NULL-Werten umzugehen.
Angenommen, Sie haben eine Emp-Tabelle mit den Spalten StartCommission und CurrentCommission, die Nullen enthalten können. Folgendes gibt nur Zeilen mit keinem Wert null zurück:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission;
Wenn Sie Zeilen einschließen möchten, in denen eine der beiden Provisionen null ist, können Sie Folgendes tun:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission
OR StartCommission IS NULL OR CurrentCommission IS NULL;
Es scheint, als ob eine Funktion existieren würde, um diese Syntax zu verkürzen. Wenn Sie jedoch LNNVL verwenden, werden alle ungleichen Datensätze und alle Datensätze mit Nullen zurückgegeben.
SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);
Wenn Sie NOT hinzufügen, werden nur Zeilen ohne Nullen zurückgegeben. Es scheint mir, dass die gewünschte Funktionalität für diesen Fall darin besteht, die wahren Bedingungen wahr und die falschen Bedingungen falsch zu halten und unbekannte Bedingungen als wahr zu bewerten. Habe ich hier wirklich einen Low Use Case erstellt? Ist es wirklich wahrscheinlicher, Unbekanntes in Wahres, Wahres in Falsches und Falsches in Wahres verwandeln zu wollen?
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);
quelle
Antworten:
Es ist eine seltsame Funktion mit einer seltsamen Geschichte - aber dann ist nvl2 seltsam.
lnnvl
ist im Grunde genommen einis not true
Operator - zweifellos kann er wie einnvl2
Dose verwendet werden. Wenn Sie jedoch jedes Mal eine Funktion nachschlagen müssen, um sich genau daran zu erinnern, was sie tut, müssen Sie sich fragen, ob es am besten ist, sie beizubehaltennvl
,coalesce
,decode
undnullif
zusammen mitcase
Ausdrücken, die intuitiver sindquelle
nullif
bis mir klar wurde, dass es eine große Hilfe sein kann, 'Division durch Null' = Null zu machen. Finden Sie nvl2 (a, c, b) wirklich viel besser als decodieren (a, null, b, c)?Um es so auszudrücken: Ich habe LNNVL in meinen mehreren Jahren als DBA- und PL / SQL-Programmierer noch nicht einmal verwendet. Ich habe gelegentlich NVL2 verwendet (und musste immer nachsehen, welche Seite wahr ist und welche nicht). Zu diesem Zeitpunkt erscheint es aus Sicht der Lesbarkeit besser, NVL, DECODE, CASE usw. zu verwenden.
Alternativ funktioniert dies, vorausgesetzt, man hat einen guten Überblick darüber, wie Oracle mit NULL und Arithmetik umgeht. Zu diesem Zeitpunkt kann man jedoch auch Ihre ursprüngliche Abfrage für die Lesbarkeit verwenden (und der Ausführungsplan ist möglicherweise auch schwerer zu treffen):
quelle
StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULL
?lnnvl
.