728x90
반응형

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   

반응형

+ Recent posts