LNNVL是一个Oracle内置函数,对于评估为FALSE或UNKNOWN的条件返回TRUE,对于评估为TRUE的条件返回FALSE。我的问题是,返回真值条件的对立而不只是处理NULL值有什么好处?
例如,假设您有一个包含StartCommission和CurrentCommission列的Emp表,其中的列可能包含空值。以下仅返回两个都不为null的行:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission;
如果要包括其中任一佣金为null的行,则可以执行以下操作:
SELECT * FROM Emp WHERE StartCommission = CurrentCommission
OR StartCommission IS NULL OR CurrentCommission IS NULL;
似乎存在一个可以缩短此语法的函数,但是使用LNNVL会返回所有非相等记录以及所有具有空值的记录。
SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission);
向其添加NOT只会返回不包含null的行。在我看来,这种情况下所需的功能是保持真实条件为真,错误条件为假以及未知条件为真。我真的在这里创建了一个低用例吗?是否真的更有可能想要将未知变成真实,将真实变成虚假,以及将虚假变成真实?
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);
今天,我遇到了LNNVL,我也试图找出或理解这一部分“返回真相的反面会有什么好处”。但是,用于示例LNNVL的语句应使用不相等的运算符:SELECT * FROM Emp WHERE LNNVL(StartCommission <> CurrentCommission); 因此它返回的结果与使用OR的语句相同。换句话说,如果使用条件,并且还希望包含具有NULL值的行,则需要将条件的否定值传递给LNNVL。
—
只有您
另一个简单的例子。仅实际收到低于20%佣金的雇员:SELECT * FROM雇员WHERE_pct <.2; 还包括完全不收取任何佣金的员工:SELECT * FROM WHERE LNNVL(commission_pct> = .2)的员工;
—
只有您,
@OnlyYou-您是正确的,要使LNNVL相同,条件必须为<>。我将其保留为=更多,因为如果函数确实使用=符号返回相同的结果,则将更有意义。本质上,该函数执行两个操作:1.空包含; 2.布尔切换。前者是有道理的,后者似乎只是混淆了需要与期望条件相反的事物。即=需要<>,<需要> =,等
—
利Riffel