'case'에 해당되는 글 1건

  1. 2010.01.03 case
ORACLE/SQL2010. 1. 3. 10:00
반응형
개별적인 값일 경우 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


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

'ORACLE > SQL' 카테고리의 다른 글

nvl2  (0) 2010.01.03
UNION  (0) 2010.01.03
NVL,DECODE  (0) 2010.01.03
constraint 제약조건 (primary, foreign , unique,check, default)  (0) 2009.11.02
char 와 varchar 그리고 VARCHAR2 와 NVARCHAR2  (0) 2009.09.11
Posted by [PineTree]