LNNVL 정당성


12

LNNVL은 Oracle 내장 기능 으로 FALSE 또는 UNKNOWN으로 평가되는 조건에 대해 TRUE를 리턴하고 TRUE로 평가되는 조건에 대해 FALSE를 리턴합니다. 내 질문은 단순히 NULL 값을 처리하는 대신 진실 조건의 반대를 반환하면 어떤 이점이 있습니까?

예를 들어, 널을 포함 할 수있는 StartCommission 및 CurrentCommission 열이있는 Emp 테이블이 있다고 가정하십시오. 다음은 null 값이없는 행만 반환합니다.

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을 추가하면 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 Commission_pct <.2; 커미션을받지 않은 직원도 포함 시키려면 : SELECT * FROM Employee WHERE LNNVL (commission_pct> = .2);
오직 당신

@OnlyYou-LNNVL이 동일하게 작동하도록하려면 조건이 <> 여야하는 것과 동일합니다. 함수가 = 기호로 동일한 결과를 반환하면 더 의미가 있기 때문에 = 더 많이 두었습니다. 기본적으로이 함수는 두 가지 작업을 수행합니다. 1. Null 포함, 2. 부울 토글. 전자는 말이되고 나중은 원하는 조건의 반대가 필요한 것들을 혼동하는 것 같습니다. 즉 =는 <>, <는> = 등이 필요합니다.
Leigh Riffel

답변:


6

이상한 역사를 가진 이상한 함수 이지만 nvl2도 이상합니다. lnnvl기본적으로 is not true연산자입니다-의심 할 여지없이 can처럼 잘 활용할 nvl2수 있지만, 기능을 사용할 때마다 함수를 찾아야 할 때 정확히 무엇을 생각 나게 할 때, 최선을 다해야하는지 궁금해합니다. nvl, coalesce, decodenullif함께 case보다 직관적있는, 표현


NVL2가 이상하지는 않지만 많이 사용하며 LNNVL을 사용한 적이 없습니다.
레이 리펠

@Leigh-이상하지 않게하기 위해 자주 사용해야한다고 생각합니다. :) nullif'0으로 나누기'= null을 만드는 데 큰 도움이 될 때까지는 사용하지 않았습니다 . 디코드 (a, null, b, c)보다 nvl2 (a, c, b)가 훨씬 더 낫습니까?
Jack은 topanswers.xyz를 시도한다고

4

이런 식으로 말하면, 나는 몇 년 동안 DBA 및 PL / SQL 프로그래머가 된 LNNVL을 아직 사용하지 않았습니다. 나는 때때로 NVL2를 사용했다 (그리고 항상 어느 쪽이 사실인지, 어느 쪽이 아닌지를 찾아야했다). 그 시점에서 가독성 관점에서 NVL, DECODE, CASE 등을 사용하는 것이 좋습니다.

또는 오라클이 NULL과 산술을 처리하는 방법에 대해 잘 처리하고 있다고 가정하지만이 시점까지 독창성을 위해 원래 쿼리를 사용할 수도 있습니다 (실행 계획도 더 어려울 수 있습니다).

/* Return all rows where StartCommission is the same
 * as Current Commission, or those rows who have a
 * NULL in either (including both)
 */

SELECT *
  FROM Emp
 WHERE StartCommission = CurrentCommission
    OR StartCommission + CurrentCommission IS NULL

-- NULL + NULL, or NULL + Number is always NULL; hence return either
-- those records that are equal, or have a combined total of NULL
-- (either or both fields will be NULL).

당신은 의미 StartCommission<>CurrentCommission OR StartCommission + CurrentCommission IS NULL합니까?
잭 topanswers.xyz 시도라고

@JackPDouglas-=로 의미가 있습니다.
레이 리펠

흥미로운 변형. 나는 당신의 결론에 동의합니다.
레이 리펠

@Leigh-나는 당신이 원하는 기능에 대한 대안이 아니라 대안에 대해 알고 lnnvl있습니다.
잭 topanswers.xyz 시도라고

@JackPDouglas-나는 그것이 Kerri가 의도 한 것이라고 생각합니다.
레이 리펠
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.