ABOUT ME

-

Today
-
Yesterday
-
Total
-

  • [Oracle/SQL] NOT EXISTS, IS NULL, CASE WHEN 다중 입력조건 검색 쿼리문
    개발자 레퍼런스 2009. 9. 7. 23:53
    반응형
    오라클(Oracle)의 SQL 쿼리 정리 입니다.

    개별적인 값일 경우 A <> B 를 하면 C에서 A != B 와 같은 뜻으로 동작합니다.
    다만 개별값이 아닌 SELECT를 이용한 조회된 그룹 혹은 조회값들이라면 아래와 같이 NOT EXISTS 쿼리문을 WHERE 절에 사용해 줌으로써 여집합의 결과를 얻을 수 있습니다.

                AND   NOT EXISTS  (   
                 SELECT
                  DISTINCT(b.tup_c) AS tup_c 
                 FROM tb_cs_jh_ch_tupcodesvc b
                 WHERE substr(b.cd_svc_c,1,2) = '60'
                     AND A.tup_c = b.tup_c
                    )

    위와 같은 역할을 하는 IS NULL을 사용한 다른 사용법입니다.


      AND   (
              SELECT  DISTINCT(b.tup_c) AS tup_c 
             FROM tb_cs_jh_ch_tupcodesvc b
             WHERE substr(b.cd_svc_c,1,2) = '60'
               AND A.tup_c = b.tup_c) IS NULL

    SELECT를 사용한 단건 혹은 다건조회시 여러가지 옵션을 제공하며 그 옵션을 체크하여 적용시키는 경우.
    즉, 여러가지 조건을 동시에 만족하는 것만의 결과값을 구해야 하는 경우 CASE 함수를 활용하여 구할 수 있습니다.

    먼저 CASE 함수의 기본 형식을 알아두세요.

    * CASE 함수

    [ 형식 ]
                   CASE 컬럼명|표현식 WHEN 조건식1 THEN 결과1
                                                  WHEN 조건식2 THEN 결과2
                                                  ......
                                                  WHEN 조건식n THEN 결과n
                                                  ELSE 결과
                   END


    아래는 CASE WHEN 조건 분기를 사용하여 여러조건을 동시에 만족하는(교집합) 특정 값들을 얻고, NOT EXISTS 를 써서 특정 결과를 뺀(여집합) 결과를 구하는 쿼리 예제 입니다.

      SELECT
                 A.tup_c                                  AS tup_c
      FROM
      (
                 SELECT A.tup_c                     AS tup_c
                            , MAX(CASE WHEN B.svc_bzcc = '00' AND :io_all_mcht = '1'  THEN '1' ELSE '0' END) AS io_all_mcht  
                            , MAX(CASE WHEN B.svc_bzcc = '01' AND :io_oiling = '1'   THEN '1' ELSE '0' END) AS io_oiling  
                            , MAX(CASE WHEN B.svc_bzcc = '02' AND :io_movie = '1'   THEN '1' ELSE '0' END) AS io_movie 
                            , MAX(CASE WHEN B.svc_bzcc = '99' AND :io_etc = '1' THEN '1' ELSE '0' END) AS io_etc 
                FROM TB_CS_JH_CH_TUPCODESVC A 
                         ,TB_CS_JH_CM_CARDSVC    B 
                WHERE A.tup_c      >=      :tup_c

    AND   NOT EXISTS  (
                 SELECT
                  DISTINCT(b.tup_c) AS tup_c 
                 FROM tb_cs_jh_ch_tupcodesvc b
                 WHERE substr(b.cd_svc_c,1,2) = '60'
                     AND A.tup_c = b.tup_c
                    )

                 
                 GROUP BY A.tup_c
                
            ) A

      WHERE a.tup_c >= :tup_c
        AND A.io_all_mcht       = :io_all_mcht  
        AND A.io_oiling         = :io_oiling 
        AND A.io_movie          = :io_movie  
        AND A.io_golf           = :io_golf 
        AND A.io_etc             = :io_etc


     GROUP BY A.tup_c
     ORDER BY A.tup_c


    유용하게 사용하시기 바랍니다.
    반응형

    댓글

Designed by Tistory.