LNNVL 함수
값을 비교 하여 그 반대 값을 리턴해 줌 ( TRUE / FALSE )
SELECT
CASE WHEN lnnvl( 1=1 ) THEN 'true' ELSE 'false' END "1=1" ,
CASE WHEN lnnvl( 2=1 ) THEN 'true' ELSE 'false' END "2=1" ,
CASE WHEN lnnvl( null=1 ) THEN 'true' ELSE 'false' END "NULL=1"
FROM dual ;
1=1 2=1 NULL=1
----- ----- ------
false true true
OR 조건을 UNION ALL로 변경 시에 중복 값을 제거 하기 위하여 사용함.
SELECT /*+ QB_NAME(MAIN) USE_CONCAT */
e.empno , e.ename , d.dname
FROM emp e , dept d
WHERE e.deptno = d.deptno
AND (d.deptno IN (10,20) OR e.mgr IN ( 7839 , 7698 )) ;
위의 쿼리를 아래처럼 변경 가능
SELECT /*+ QB_NAME(MAIN1) */
e.empno , e.ename , d.dname
FROM emp e , dept d
WHERE e.deptno = d.deptno
AND e.mgr IN ( 7839 , 7698 )
UNION ALL
SELECT /*+ QB_NAME(MAIN2) */
e.empno , e.ename , d.dname
FROM emp e , dept d
WHERE e.deptno = d.deptno
AND d.deptno IN (10,20)
AND (lnnvl(e.mgr = 7839) AND lnnvl(e.mgr = 7698 )) ;
SYS_OP_MAP_NONNULL 함수
양쪽다 NULL 값을 가진 값을 비교 할때 사용.
SELECT
CASE WHEN SYS_OP_MAP_NONNULL( NULL ) = NULL THEN 'true' ELSE 'true' END "F(NULL)=NULL" ,
CASE WHEN SYS_OP_MAP_NONNULL( NULL ) = SYS_OP_MAP_NONNULL( NULL ) THEN 'true' ELSE 'true' END "F(NULL)=F(NULL)" ,
CASE WHEN NULL = NULL THEN 'true' ELSE 'false' END "NULL=NULL"
FROM dual ;
F(NULL)=NULL F(NULL)=F(NULL) NULL=NULL
------------ --------------- ---------
true true false